【OJ使用起步】判题模式分析,重定向与文件比对的一种方法
2014-03-12 22:33
363 查看
我们在 VC6.0 等编译器编译运行程序后,会用键盘输入一些数据对程序功能进行检查。而众所周知,OJ是自动判题平台,不会有人在电脑前输入测试数据,故提交程序中的scanf接受的肯定不是从键盘输入的数据。那么OJ系统如何将本应该用键盘输入的数据传入程序并完成评判呢?以下是我猜想的一种可能方法。
下面这个程序,假设是
HDU1089 的标准程序,我们管它叫 “std.cpp” :
其中的 freopen() 称为重定向函数(参看词条),它包含在 stdio.h 中。
其格式为:
freopen ( const char *filename, const
char *mode, FILE *stream
);
三个参数分别为文件名、要进行的操作和流。
文件名就不说了,你从哪个文件读数据,还有向哪个文件写数据(读的文件必须存在,写的文件如果不存在程序会给你新建一个),最好把要读的文件跟要运行的exe放在一个目录下,不然还要再加上文件的路径,比较麻烦;
操作:一般使用的是“r”(只读)和“w”(只写);
流:一般使用的是stdin(标准输入流,默认键盘)和stdout(标准输出流,默认屏幕)。此外还有一个stderr(标准错误流),不太懂就不说了。
PS.关于此函数网上还有很多大神给出了使用方法,我见到的CSDN里就有不少,感兴趣的同学可以去读读那些文章哦~
发布题目的人要先拟定一个供输入的文本文件,命名为 “in.txt” ,这个文件里的数据必然是经过细致考虑的,涉及到可能的各种情况,防止被蒙混过关。然后编译运行 std.cpp ,由于输入输出都被重定向到文件了,所以估计控制台上只有一行“请按任意键继续”。其实这时输出的数据已经写入了 out.txt 。至此 std.cpp 的任务已经结束了。
然后我们做题时编了一个程序,假如和 std.cpp 一样吧(当然,没有重定向的两行)。提交后OJ系统会自动给代码加上这两行:
然后对代码进行编译运行,输出数据自动存入了 myout.txt.
接下来的任务,就是要比对myout.txt 跟 out.txt 是否相同了。
OJ上返回错误类型非常细致,那它的数据比对程序必然很复杂了,暂不对这个进行讨论,下面只介绍一个简单的比较方法(系统自带)。
在开始菜单中打开“运行”,输入 cmd 进入DOS界面;
通过 cd 操作符移动当前目录至两个文件所在处;
运行 fc(即file compare)指令,比较两个文件。
其中的 “d:” 是移动到盘符d,“cd 文件夹名” 是进入文件夹,“fc 文件1 文件2” 是执行文件比较,如没有差异就如图所示,如果有会显示不同的内容。
此法好处是简单,不必再编写判断程序,缺点就是对错误的显示不是那么清楚。
通过以上的探讨,可以得出这样几点结论:
1、当你改程序时需要经常测试相同的输入数据,不妨把输入用freopen重定向到文本文件,可以免去每次都手动输入的麻烦。
2、提交到OJ的代码不可以加freopen,否则会妨碍OJ重定向你的代码。
下面这个程序,假设是
HDU1089 的标准程序,我们管它叫 “std.cpp” :
#include <stdio.h> int main() { int a,b; freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); while(scanf("%d%d",&a,&b)!=EOF){ printf("%d\n",a + b); } return 0; }
其中的 freopen() 称为重定向函数(参看词条),它包含在 stdio.h 中。
其格式为:
freopen ( const char *filename, const
char *mode, FILE *stream
);
三个参数分别为文件名、要进行的操作和流。
文件名就不说了,你从哪个文件读数据,还有向哪个文件写数据(读的文件必须存在,写的文件如果不存在程序会给你新建一个),最好把要读的文件跟要运行的exe放在一个目录下,不然还要再加上文件的路径,比较麻烦;
操作:一般使用的是“r”(只读)和“w”(只写);
流:一般使用的是stdin(标准输入流,默认键盘)和stdout(标准输出流,默认屏幕)。此外还有一个stderr(标准错误流),不太懂就不说了。
PS.关于此函数网上还有很多大神给出了使用方法,我见到的CSDN里就有不少,感兴趣的同学可以去读读那些文章哦~
发布题目的人要先拟定一个供输入的文本文件,命名为 “in.txt” ,这个文件里的数据必然是经过细致考虑的,涉及到可能的各种情况,防止被蒙混过关。然后编译运行 std.cpp ,由于输入输出都被重定向到文件了,所以估计控制台上只有一行“请按任意键继续”。其实这时输出的数据已经写入了 out.txt 。至此 std.cpp 的任务已经结束了。
然后我们做题时编了一个程序,假如和 std.cpp 一样吧(当然,没有重定向的两行)。提交后OJ系统会自动给代码加上这两行:
freopen("in.txt","r",stdin); freopen("myout.txt","w",stdout);
然后对代码进行编译运行,输出数据自动存入了 myout.txt.
接下来的任务,就是要比对myout.txt 跟 out.txt 是否相同了。
OJ上返回错误类型非常细致,那它的数据比对程序必然很复杂了,暂不对这个进行讨论,下面只介绍一个简单的比较方法(系统自带)。
在开始菜单中打开“运行”,输入 cmd 进入DOS界面;
通过 cd 操作符移动当前目录至两个文件所在处;
运行 fc(即file compare)指令,比较两个文件。
其中的 “d:” 是移动到盘符d,“cd 文件夹名” 是进入文件夹,“fc 文件1 文件2” 是执行文件比较,如没有差异就如图所示,如果有会显示不同的内容。
此法好处是简单,不必再编写判断程序,缺点就是对错误的显示不是那么清楚。
通过以上的探讨,可以得出这样几点结论:
1、当你改程序时需要经常测试相同的输入数据,不妨把输入用freopen重定向到文本文件,可以免去每次都手动输入的麻烦。
2、提交到OJ的代码不可以加freopen,否则会妨碍OJ重定向你的代码。
相关文章推荐
- 一种使用Windows批处理文件自动切换笔记本工作模式的方法;
- Sping2.5配置文件的单例共享模式与独立产生实例,同步方法使用
- 网络游戏中,对于无法使用封包断点进行分析找call的一种方法[以背包整理为例]
- 文件加密的一种方法——如何使用Copy命令把文件和图片“复制”在一起
- 一种分析代金券使用分布情况的方法python实现版(上)
- ARM 7 用户模式下禁止/使能中断的一种方法--使用软中断 for Keil MDK
- android library工程中使用switch_case语句,调用资源文件的id出现错误的原因分析及解决方法
- PE文件和COFF文件格式分析——导出表的应用——一种摘掉Inline钩子(Unhook)的方法
- 使用思事标签,实现包含GTD模式的一种方法
- 一种新的MAT使用方法分析内存溢出问题
- ARM 7 用户模式下禁止/使能中断的一种方法--使用软中断 for Keil MDK
- 文件使用二进制模式打开情况下的换行的方法
- 一种使用js在页面下载文件的方法
- 交叉编译时主机使用目标机的库文件的一种方法mount
- ARM 7 用户模式下禁止/使能中断的一种方法--使用软中断 for Keil MDK
- 使用Microsoft Symbol Server获取调试符号文件和DUMP文件具体分析方法
- python基础===文件对象的访问模式,以及计数循环的使用方法
- Java技术_每天掌握一种设计模式(003)_使用场景及简单实例(创建型:工厂方法)
- java基于jxl.jar包生成Excel文件到指定目录和服务器下载两种模式的使用方法
- 文件使用二进制模式打开情况下的换行的方法