判题系统的程序判题模块的制作与思考(1)

【贴出大学里写的博客,挺有意思的.】
这是大学里最后一个本科项目(设计开发一个包括类似于ACM在线判题的系统),最近做了一些程序判题模块的事情,要在图形界面下跟DOS控制台互相“通信”,。
刚开始时认为只要用一些DOS命令行,再通过Windows函数system(str)传进去就能解决问题。
很简单,查阅了一些简单的命令,实现如下:

假设机器上C装有Dev-C++(GNU),C上有源文件,并将目标文件放在C上。如下命令就可完成编译:

C:/Dev-Cpp/bin/g++.exe -Wno-deprecated C:/1.cpp -o C:/1.exe
关键的问题是如何判断它是否正确,后来用了很多垃圾办法实现了,比如:检查是否有目标文件存在或读控制台
是是否有ERROR字样。

下一步就是如何将是判断运行结果是否正确,很显然,会想到用DOS重定向去比对结果,
C:/1.exe <in. txt> temp.txt,
然后在去比对temp.txt和out.txt文件中的内容是否一致,(问题:如何放宽条件,比如一些回车或者空格会影响结果,那样就太苛刻了。)
还要处理死循环。


到这时,做了个简单的例子试了试,原来每次都会弹出一个黑乎乎的控制台窗口,这情况绝对不能有,影响效果。

所以就想办法去隐藏控制台,当然system(*)函数不能用了,费了些时间找到了Windows   API 的Winexec(,);,好高兴,因为它能方便的去隐藏控制台只要在后面用一个SW_HIDE参数即可。

后来发现老出错,这就怪了,怎么会有错呢?真是百思不得其解,以为程序有逻辑错,调了很长时间,没有结果,真伤心。
后来,我查了相关资料,原来:看似简单的system(),调用时,内部已经用了DOS的Shell,所以能够方便地实现输入输出重定向。但是Winexec(,)只能够简单地运行命令,比如:C:/1.exe,就能调用运行,一旦发现 “<”“>”,它就会将它视为路径名的一部分,从而做不到与DOS控制台“通信”。
最后这能放弃了。


还有一个Shellexecute();但是不能支持重定向,所以我没研究就放弃了。
此时,我逃避不了做一些底层的东西了,通过创建进程和管道实现与DOS控制台“通信”.开始看操作系统了。

现在已经基本实现了,后续资料将尽快贴出。2007-5-20

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值