freopen函數的使用以及freopen與fopen的區別 open、fopen、freopen區別(文件操作)

freopen函數的使用以及freopen與fopen的區別 

https://www.cnblogs.com/hi3254014978/p/11450960.html

freopen函數的使用:參見這篇博客https://www.cnblogs.com/moonlit/archive/2011/06/12/2078712.html

當我們求解acm題目時,通常在設計好算法和程序後,要在調試環境(例如VC等)中運行程序,輸入測試數據,當能得到正確運行結果後,纔將程序提交到oj中。但由於調試往往不能一次成功,每次運行時,都要重新輸入一遍測試數據,對於有大量輸入數據的題目,輸入數據需要花費大量時間。 
        使用freopen函數可以解決測試數據輸入問題,避免重複輸入,不失爲一種簡單而有效的解決方法。 

函數名:freopen 
聲明:FILE *freopen( const char *path, const char *mode, FILE *stream ); 
所在文件: stdio.h 
參數說明: 
path: 文件名,用於存儲輸入輸出的自定義文件名。 
mode: 文件打開的模式。和fopen中的模式(如r-只讀, w-寫)相同。 
stream: 一個文件,通常使用標準流文件。 
返回值:成功,則返回一個path所指定文件的指針;失敗,返回NULL。(一般可以不使用它的返回值) 
功能:實現重定向,把預定義的標準流文件定向到由path指定的文件中。標準流文件具體是指stdin、stdout和stderr。其中stdin是標準輸入流,默認爲鍵盤;stdout是標準輸出流,默認爲屏幕;stderr是標準錯誤流,一般把屏幕設爲默認。
   下面以在VC下調試“計算a+b”的程序舉例。 
C語法:

 

#include <stdio.h> 
int main() 
{ 
int a,b; 
freopen("debug\\in.txt","r",stdin); //輸入重定向,輸入數據將從in.txt文件中讀取 
freopen("debug\\out.txt","w",stdout); //輸出重定向,輸出數據將保存在out.txt文件中 
while(scanf("%d %d",&a,&b)!=EOF) 
printf("%d\n",a+b); 
fclose(stdin);//關閉文件 
fclose(stdout);//關閉文件 
return 0; 
} 

 

C++語法
#include <stdio.h> 
#include <iostream.h> 
int main() 
{ 
int a,b; 
freopen("debug\\in.txt","r",stdin); //輸入重定向,輸入數據將從in.txt文件中讀取 
freopen("debug\\out.txt","w",stdout); //輸出重定向,輸出數據將保存在out.txt文件中 
while(cin>>a>>b) 
cout<<a+b<<endl; // 注意使用endl 
fclose(stdin);//關閉文件 
fclose(stdout);//關閉文件 
return 0; 
}


freopen("debug\\in.txt","r",stdin)的作用就是把標準輸入流stdin重定向到debug\\in.txt文件中,這樣在用scanf或是用cin輸入時便不會從標準輸入流讀取數據,而是從in.txt文件中獲取輸入。只要把輸入數據事先粘貼到in.txt,調試時就方便多了。
類似的,freopen("debug\\out.txt","w",stdout)的作用就是把stdout重定向到debug\\out.txt文件中,這樣輸出結果需要打開out.txt文件查看。

需要說明的是:
1. 在freopen("debug\\in.txt","r",stdin)中,將輸入文件in.txt放在文件夾debug中,文件夾debug是在VC中建立工程文件時自動生成的調試文件夾。如果改成freopen("in.txt","r",stdin),則in.txt文件將放在所建立的工程文件夾下。in.txt文件也可以放在其他的文件夾下,所在路徑寫正確即可。
2. 可以不使用輸出重定向,仍然在控制檯查看輸出。
3. 程序調試成功後,提交到oj時不要忘記把與重定向有關的語句刪除

 

freopen與fopen的區別:參見這篇博客:https://blog.csdn.net/joapolarbear/article/details/69062946
freopen作用是將標準輸入輸出重定向,stdin從鍵盤重定向到文件,stdout從屏幕重定向到文件,stderr也從屏幕重定向到文件,這樣操作的弊端就是會使得所有輸入輸出都將在文件中操作,而如果不想改變標準輸入輸出的方向,而只是想把部分數據寫入到文件或部分數據從文件中讀取,那麼就需要用到fopen函數了,這個函數會爲每個文件單獨創建一個文件輸入流或輸出流,而不會改變整體的輸入輸出流方向,所以這兩個函數都是有很大用處的

C語言中freopen()函數是用來重新定向的,所謂重新定向是給輸入和輸出的位置重新定向。原本輸入位置是鍵盤緩存區,輸出在屏幕上,用了重新定向後可以將輸入位置改變成一個文件,而輸出位置也可以輸出到一個文件中,具體代碼可以這麼寫:

freopen ("text.txt","r",stdin);  freopen ("text1.txt","w",stdout);

這裏輸入和輸出便都在文件中操作了。可是這樣做有一個弊端,就是所有輸入輸出都將在文件中操作,如何靈活控制呢?這就要用到fopen()函數了,可以自由在文件輸入輸出中轉換,具體語法是:

FILE *fin,*fout;  
fin = fopen("text.txt","rb");  
fout = fopen("text1.txt","wb");  
fscanf (fin,"%d",&amp;x);  
fprintf (fout,"%d",x);  
fclose(fin);  
fclose(fout)

 

這裏函數稍微複雜了些,不過仔細看看也蠻簡單的,最重要的是多了文件關閉操作,這樣是爲了不持續佔用系統資源。在讀取、寫入操作時用“rb”的原因是爲了兼容Linux系統,只在windows下運行只要“r”即可,同樣,scanf和printf函數都要改成fscanf和fprintf,在前面加上你要輸入的文件和輸出的文件名,這樣就可以有選擇性的操作文件了。  

 

 open、fopen、freopen區別(文件操作)

同樣的,還有:write、fwrite、read、fread、close、fclose

主要區別:open是系統底層的,fopen是c/c++的庫函數,freopen也是庫函數

可移植性:庫函數肯定比底層的open要好,其中freopen幾乎不用改變源代碼,就能重定向(re=redirect?)輸入輸出流。

細節見:https://blog.csdn.net/a656343072/article/details/40539889

作者:徐超Change
鏈接:https://www.jianshu.com/p/f5809ccc6a15
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章