演算法競賽之 輸入輸出重定向

2022-06-10 23:06:19 字數 2649 閱讀 5518

當我們求解acm題目時,通常在設計好演算法和程式後,要在除錯環境(例如vc等)中執行程式,輸入測試資料,當能得到正確執行結果後,才將程式提交到oj中。但由於除錯往往不能一次成功,每次執行時,都要重新輸入一遍測試資料,對於有大量輸入資料的題目,輸入資料需要花費大量時間。 

乙個好的方法是用檔案一一把輸入資料儲存在 檔案中,輸出資料也儲存在檔案中。這樣,只要事先把輸入資料儲存在檔案中,就不必每次重新輸入了;資料輸出在檔案中也避免了「輸出太多,一捲屏前面的就看不見了」這樣的尷尬,執行結束後,慢慢瀏覽輸出檔案即可。如果有標準答案檔案,還可以進行檔案比較」,而無須程式設計人員逐個檢查輸出是否正確。事實上,幾乎所有演算法競賽的輸入資料和標準答案都是儲存在檔案中的。使用檔案最簡單的方法是使用輸入輸出重定向,只需在main函式的入口處加入以下兩條語句:

freopen("input.txt",

"r", stdin) ;

freopen("output.txt",

"w", stdout) ;

函式名: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是標準錯誤流,一般把螢幕設為預設。

上述語句將使得scanf從檔案input.txt 讀入,printf 寫入檔案output.txt。

事實上,

不只是scanf和printf,所有讀鍵盤輸入、寫螢幕輸出的函式都將改用檔案。儘管這樣做很方便,

並不是所有演算法競賽都允許用程式讀寫檔案。甚至有的競賽允許訪問檔案,

但不允許用

freopen這樣的重定向方式讀寫檔案。參賽之前請仔細閱讀檔案讀寫的相關規定。

下面以在vc下除錯「計算a+b」的程式舉例。

【c語法】

1 #include 2

intmain()

3

【c++語法】

1

2 #include 2

3 #include 3

4int

main() 45

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檔案檢視。

提示請在比賽之前了解檔案讀寫的相關規定:是標準輸入輸出(也稱標ii/o,即直接讀鍵盤

、寫螢幕), 還是檔案輸入輸出?如果是檔案輸入輸出,是否禁止用重定向方式的

問檔案?

需要說明的是:

1. 在freopen("debug\\in.txt","r",stdin)中,將輸入檔案in.txt放在資料夾debug中,資料夾debug是在vc中建立工程檔案時自動生成的除錯資料夾。如果改成freopen("in.txt","r",stdin),則in.txt檔案將放在所建立的工程資料夾下。in.txt檔案也可以放在其他的資料夾下,所在路徑寫正確即可。

2. 可以不使用輸出重定向,仍然在控制台檢視輸出。

3. 程式除錯成功後,提交到oj時不要忘記把與重定向有關的語句刪除。

如果比賽中要求用檔案輸入輸出,但禁止用重定向的方式,又當如何呢?

在演算法競賽中,如果不允許使用重定向方式讀寫資料,應使用fopen和fscant,fprintf進行輸入輸出。

我們還是以前面的例子為例:

【c語法】

1 #include 2

intmain()

3

【c++語法】

1 #include 2 #include 3

using

namespace

std;

4int

main() 518

19 fin.close();//

關閉檔案

20 fout.close();//

關閉檔案

21return0;

22 }

重定向和fopen兩種方法各有優劣。重定向的方法寫起來簡單、自然,但是不能同時讀寫檔案和標準輸入輸出; fopen 的寫法稍顯繁瑣,但是靈活性比較大(例如,可以反覆開啟開讀寫檔案)。

【提示】

如果想把fopen版的程式改成讀寫標準輸入輸出,只需賦值"fin = stdin; fout = stdout;" 即可,不要呼叫fopen和fclose。

輸入輸出重定向

使用標準輸入流,標準輸出流和標準錯誤流,這些標準流都被預分配給鍵盤和顯示器。在需要的時候,可以使用重定向臨時改變這些預設分配。重定向是這樣一種過程,我們借助它指定乙個用於替代某個 標準檔案的檔案。輸入重定向 可以將標準輸入從鍵盤重定向到任何文字檔案。輸入重定向運算子為小於號 意味著該命令從此給 派的...

輸入輸出重定向

1.標準輸入的控制 語法 命令 檔案將檔案做為命令的輸入。例如 mail s mail test wesongzhou hotmail.com file1 將檔案file1 當做信件的內容,主 題名稱為mail test,送給收信人。2.標準輸出的控制 語法 命令 檔案將命令的執行結果送至指定的檔案...

輸入輸出重定向

想象一下,當我們寫了個程式,開始是在命令列下執行的程式,後來用mfc之類的改寫為窗體程式,原先用printf輸出的trace都不可見了,但是我們又需要 輸出到檔案分析 怎麼辦?1 開始寫的時候你定義乙個mytrace的巨集 2 你可以把printf換成fprintf 3 使用輸出重定向。第一種情況很...