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


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,在前面加上你要輸入的文件和輸出的文件名,這樣就可以有選擇性的操作文件了。  

感謝兩位博主:https://www.cnblogs.com/moonlit/archive/2011/06/12/2078712.html

        https://blog.csdn.net/joapolarbear/article/details/69062946

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM