寫在前面
做ACM題目的時候,往往要比較程序輸出與樣例輸出,以確保程序正確性。當樣測試樣例比較少的時候,直接人工比對就可以了,但當測試數據比較大(上百或更多)的時候,人工檢查就容易出錯了。
假設現有兩個測試文件1381.in和1381.ans,其中1381.in是程序輸入文件,1381.ans程序輸入對應的正確答案的輸出。假設我們將自己編寫的程序重定向輸出到1381.out文件。那麼我們就需要比對1381.ans和1381.out兩個文件。只有當兩個文件每一行均相等的時候,才說明程序通過了該測試用例。
文件重定向
方法一:在源碼中重定向
重定向輸入輸出流有兩種方法。一種是在源碼中添加如下代碼:
freopen("1381.in", "r", stdin);
freopen("1381.out", "w", stdout);
freopen是定義在C的stdio頭文件中,因此需要添加頭文件#include <stdio.h>。
而在C++中,則需要需要添加頭文件#include <cstdio>才能使用freopen函數。
方法二:命令行方式
另一種方法是在命令行窗口(Dos)下運行程序,如下圖所示:
注:
1,其中第一個爲要執行的命令。 <表示重定向輸入流,其右方的1381.in爲輸入文件。>表示重定向輸出流,右方的1381.out表示輸出的內容將要存放的文件名。
2,可在程序所在文件夾內空白處按住shift鍵,然後鼠標右擊,點擊“在此處打開命令行窗口”,再輸入上圖所示命令即可。
文件比對
方法一:寫程序判斷
生成好1381.out文件之後,接下來的工作就是進行文件比對了。其實文件的比對邏輯是很簡單的,無非就是同時從兩個文件中讀取一行字符串,然後比較字符串是否相同。若不相同,則將其輸出。所以自己動手寫程序判斷就是了。上圖中的differ.py是一個Python腳本程序,要運行該腳本,需安裝Python3.0以上版本的Python解釋器。當然,也可以自己用C/C++編寫程序校驗。differ.py代碼如下:
name = input("輸入文件名\n")
with open(str(name) + ".ans", "r") as stan:
with open(str(name) + ".out", "r") as f:
for s, t in zip(stan, f):
s = s.rstrip()
t = t.rstrip()
if s != t:
print()
print("答案:", s)
print("程序:", t)
print()
print("down!")
命令行窗口運行效果如下:
程序顯示1381.ans中值爲81的行與1381.out中對應行的不相同。也就是說,答案是81,但是程序處理得到的錯誤結果爲90。
方法二:文件比較命令fc
事實上,在Windows中內置瞭如上功能的文件比較命令fc,只需如下圖所示使用即可:
需要特別注意的是,在某些機器上,執行上述命令的時候,會出現“fc 不是內部或外部命令.....”這樣的提示,這是沒有配置好“環境變量的”緣故。具體操作方法,可自行搜索。對於64位Win7系統,可參考:http://bbs.pcbeta.com/viewthread-869777-1-1.html。如果按鏈接所示配置之後依然出現提示,可嘗試重啓機器。
方法三:使用軟件來比對文件
最後,我們可以使用軟件來比對文件。這裏推薦Beyond Compare,下載地址可自行搜索。如下是程序運行截圖: