摘录自《算法竞赛入门指导》P68
上面的程序并不是很方便:每次测试都要手动输入许多数。尽管可以用前面讲的管道的方法,但数据只是保存在命令行中,仍然不够方便。
一个好的方法是用文件——把输入数据保存在文件中,输出数据也保存在文件中。这样,只要事先把输入数据保存在文件中,就不必每次重新输入了;数据输出在文件中也避免了“输出太多,一卷屏前面的就看不见了”这样的尴尬,运行结束后,慢慢浏览输出文件即可。如果有标准答案文件,还可以进行文件比较 ,而无须编程人员逐个检查输出是否正确。事实上,几乎所有算法竞赛的输入数据和标准答案都是保存在文件中的。
使用文件最简单的方法是使用输入输出重定向,只需在main函数的入口处加入以下两条语句:
freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
上述语句将使得scanf从文件input.txt读入,printf写入文件output.txt。事实上,不只是scanf和printf,所有读键盘输入、写屏幕输出的函数都将改用文件。
尽管这样做很方便,并不是所有算法竞赛都允许用程序读写文件。甚至有的竞赛允许访问文件,但不允许用freopen这样的重定向方式读写文件。参赛之前请仔细阅读文件读写的相关规定。
提示2-21:请在比赛之前了解文件读写的相关规定:是标准输入输出(也称标准I/O,即直接读键盘、写屏幕),还是文件输入输出?如果是文件输入输出,是否禁止用重定向方式访问文件?
多年来,无数选手因文件相关问题丢掉了大量分数。一个普适的原则是:详细阅读比赛规定,并严格遵守。例如,输入输出文件名和程序名往往都有着严格规定,不要弄错大小写,不要拼错文件名,不要使用绝对路径或相对路径。
举例:
例如,如果题目规定程序名称为test,输入文件名为test.in,输出文件名为test.out,就不要犯以下错误。
错误1:程序存为t1.c(应该改成test.c)。
错误2:从input.txt读取数据(应该从test.in读取)。
错误3:从tset.in读取数据(拼写错误,应该从test.in读取)。
错误4:数据写到test.ans(扩展名错误,应该是test.out)。
错误5:数据写到c:\\contest\\test.out(不能加路径,哪怕是相对路径。文件名应该只有8
个字符:test.out)。
当然,这些错误都不是选手故意犯下的。前面说过,利用文件是一种很好的自我测试方法,但如果比赛要求采用标准输入输出,就必须在自我测试完毕之后删除重定向语句。选手比赛时一紧张,就容易忘记将其删除。
有一种方法可以在本机测试时用文件重定向,但一旦提交到比赛,就自动“删除”重定向语句。