本人对ACM竞赛很感兴趣,尽管没怎么参加过比赛,也没有太多时间花去做题,但是各大高校的在线评判系统(POJ)还是上去玩过。记得验证自己程序的正确性时,往往要将题目给的标准测试用例拷贝到命令行下,然后运行,发现不对头后,就再修改,再拷贝,再运行...反复拷贝测试用例是一个花费时间,又极其无聊的动作。
偶然看到一本关于ACM比赛的书,发现书中的全部提交結果都是如下形式:
#include <iostream>
#include <fstream>
int main()
{
int a,b;
//fstream cin("input.txt");
//ofstream cout("output.txt");
while(cin>>a>>b) {
...
cout<<x<<y;
...
}
return 0;
}
特别之处是fstream cin("input.txt");
这一句及其下一句,如果仔细想想,你就会惊叹作者的聪明。 这两句将程序的输入改为input.txt文件,将输出改为output.txt文件,当程序在测试阶段时, 取消掉那一句前面的注释,这样就定义了本地局部变量cin和cout,而且这两个变量是fstream文件流, 这样下面的cin>>a>>b
就是从文件input.txt中读取数据,输出写入到output.txt文件。 如果程序写好,要提交了,这时只需要将两句注释掉,这样cin就变成std名字空间里的iostream类型, cout也成了全局的ostream类型,下面的cin>>a>>b
就表示从终端接受数据的输入了。 如果折腾过Linux,就不会觉得这种偷梁换柱很奇怪了,因为Linux中输入输出本来就是对文件的操作,这都得益于虚拟文件系统的高妙!
不过,搞ACM的朋友可能更喜欢使用纯C,不大喜欢使用cin与cout之类,呵呵,后来看一些杂书,发现C语言里也可以很方便地实现这种输入输出的替换,只需将上面例子中的两句改为:
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
即可,达到的效果完全一样。
如果使用Linux系统,可以将输出标准结果先写入到一个文件,如result.txt,然后再使用diff命令将output.txt与result.txt进行比较,有不一样,就表示输出结果错误。当然windows下使用beyond compare工具也可以,不过没有一个diff命令来的方便哟。