當我們求解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
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
#include
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<
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時不要忘記把與重定向有關的語句删除。