大一新生,首次创作,虚心受教。

实现思路:

一、需要一个输入文件(input.txt),两个对拍程序(main1.exe,main2.exe)

二、将标准输入重定向为input.txt。将标准输出分别重定向为output1.txt,output2.txt。

三、对两个输出文件进行比较,输出结果。

具体实现:

一、所需头文件

 :  #include <stdio.h>
: #include <stdlib.h>
: #include <sys/file.h>
: #include <unistd.h>
: #include <sys/types.h>

二、文件重定向并进行系统调用执行main1.exe main2.txt

 :      int fdout1 = open("stdout1.txt", O_RDWR|O_TRUNC|O_CREAT, );
: int fdout2 = open("stdout2.txt", O_RDWR|O_TRUNC|O_CREAT, );
//以每次打开文件清零和如不存在便创建就打开两个输出文件
 :      int fdin = open("stdin.txt", O_RDWR, );
: int tempin = dup(STDIN_FILENO);
:     int tempout = dup(STDOUT_FILENO), line = ;
//对标准输出输入描述符表进行拷贝,防止系统清除其指向的文件表

 :      char buf1[], buf2[];
:
: dup2(fdin, STDIN_FILENO);
: dup2(fdout1, STDOUT_FILENO);
//重定向

:      if (system("main1.exe") == )
: write(tempout, "NO EXE", );
: fdin = open("stdin.txt", O_RDWR, );
: dup2(fdin, STDIN_FILENO);
//可能有些同学要问了这里问什么要对标准输入重定向两次,具体解释略长参见后文。

:      dup2(fdout2, STDOUT_FILENO);
: if (system("main2.exe") == )
: write(tempout, "NO EXE", );
: dup2(tempout, STDOUT_FILENO);

//恢复标准输出

:      lseek(fdout1, , SEEK_SET);
: lseek(fdout2, , SEEK_SET);

//重置文件读取位置,具体解释同十三行后。

三、对输出文件的处理

 for(;;)
{
int n; if ((n = read(fdout1, buf1, )) > && read(fdout2, buf2, ) > )
{
int i, j = ;
char buffer[]; for (i = ; i < n; i++)
{
buffer[j++] = buf1[i];
if (buf1[i] == buf2[i])
{
if (buf1[i] == '\n')
{
j = ;
line++;
}
}
else
{
printf("The difference in line %d between stdout1.txt and stdout2.txt\n", line);
buffer[j] = '\0';
printf("%s\n", buffer);
buffer[--j] = buf2[i];
printf("%s\n", buffer);
break; }
}
if (i != n)
break; }
else
{
printf("Can't find difference in this instance\n");
break;
}
}

四、对上文问题的解释

以上的两个问题都是由于带缓冲区的文件读写和不带缓冲区的文件读写混用产生的问题。标准输出和标准输入是带缓冲区的,而read和write函数不带缓冲区,所以进行重定向时,一旦将不带缓冲区的用read打开的输入文件stdin.txt重定向到标准输入,则输入文件中的内容会被输入到缓冲区中,引起当前读写文件位置的变化,下次程序main2.exe引用的时候就会出现错误。同理在输出文件操作的时候也要进行当前读写位置的复原。

五、警告

本程序bug多多,但基本能用,尤其是本人原先不熟悉windows下的一下编程,完成后才发现用windows写一个bat程序要简单的多,这就造成了在windows环境下以linux系统命令编写的一个不伦不类的对拍程序。

由于程序写的确实有点烂,主要目的原来是想救一救我被学校评测网站虐的惨不忍睹的C语言习题,顺便熟悉一下进来学习的知识,所以想顺便放上来分享一下,欢迎各位园友指出错误,一定虚心受教。

目前的bug有:如果一行超出1024b,就会发生溢出;有些情况可能行号不太准确。

六、小感

第一次写文章,排版各方面不太熟悉,希望各位谅解。

源代码http://files.cnblogs.com/Bright-Star/main.zip

  

最新文章

  1. iOS-语法syntax
  2. AOP是什么?
  3. http2协议翻译(转)
  4. MD5加密算法实现用户信息加密
  5. android请求root权限
  6. VisualStudio基本使用(2)-使用VS2013来编译C语言程序
  7. bootstap 滚动监听
  8. SQL基础函数
  9. asp.net程序发布详解
  10. 如何将视频导入到ipad中并播放
  11. htm,css,javascript及其他的注释方式
  12. RISC-V踩坑记----__builtin_clz((x)库函数的应用
  13. PythonStudy——列表操作 List operatio
  14. double
  15. python笔记2-数据类型:列表[List]常用操作
  16. 自定义ListView 、GradView 重写onMeasure方法让其正确显示
  17. js ParseUrl
  18. python网络编程-paramiko
  19. FIS 的思想和优点
  20. hystrix -hystrix常用配置介绍

热门文章

  1. stdout 与 stderr 的区别
  2. POJ2479 Maximum sum(dp)
  3. 求帮看!!!!BZOJ 1014 [JSOI2008]火星人prefix
  4. 【模拟】Vijos P1062 迎春舞会之交谊舞
  5. Silverlight闹钟
  6. CSU 1160 把十进制整数转换为十六进制,格式为0x开头,10~15由大写字母A~F表示
  7. C++开源小贱鸡(simsimi api)
  8. linux之utime函数解析
  9. RAC集群启动停止
  10. python_Opencv_使用Matplotlib模块