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

实现思路:

一、需要一个输入文件(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

  

用C实现一个简单的对拍器——致每个曾经为求AC披星戴月的程序员们的更多相关文章

  1. 使用lua实现一个简单的事件派发器

    设计一个简单的事件派发器,个人觉得最重要的一点就是如何保证事件派发过程中,添加或删除同类事件,不影响事件迭代顺序和结果,只要解决这一点,其它都好办. 为了使用pairs遍历函数,重写了pairs(lu ...

  2. Arachnid包含一个简单的HTML剖析器能够分析包含HTML内容的输入流

    Arachnid是一个基于Java的web spider框架.它包含一个简单的HTML剖析器能够分析包含HTML内容的输入流.通过实现Arachnid的子类就能够开发一个简单的Web spiders并 ...

  3. 自己动手实现一个简单的JSON解析器

    1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 ...

  4. 使用Python制作一个简单的刷博器

    呵呵,不得不佩服Python的强大,寥寥几句代码就能做一个简单的刷博器. import webbrowser as web import time import os count=0 while co ...

  5. 一个简单的json解析器

    实现一个简单地json解析器. 两部分组成,词法分析.语法分析 词法分析 package com.mahuan.json; import java.util.LinkedList; import ja ...

  6. 用c#自己实现一个简单的JSON解析器

    一.JSON格式介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着很多优点.例如易读性更好,占用空间更 ...

  7. 实现了一个简单的cage变形器

    今天实现了一个简单变形器,可以用一个网格的形状影响另一个网格的形状. 如图,蓝色网格的形状被灰色网格操控. 当前的算法非常简单,就是计算蓝色网格每个点到灰色网格每个点的距离,以距离x次方的倒数作为权重 ...

  8. Objective-C ,ios,iphone开发基础:快速实现一个简单的图片查看器

    新建一个single view 工程: 关闭ARC , 在.xib视图文件上拖放一个UIImageView  两个UIButton ,一个UISlider ,布局如图. 并为他们连线, UIImage ...

  9. 利用poi包装一个简单的Excel读取器.一(适配一个Reader并提供readLine方法)

    通常,读文本我们会使用BufferedReader,它装饰或者说管理了InputStreamReader,同时提供readLine()简化了我们对文本行的读取.就像从流水线上获取产品一样,每当取完一件 ...

随机推荐

  1. 【HDOJ】1053 Entropy

    构造huffman编码,果断对字符进行状态压缩. #include <iostream> #include <cstdio> #include <cstring> ...

  2. C++ STL之set常用指令

    set,关联容器,元素不允许有重复,数据被组织成一棵红黑树,以牺牲插入和删除元素的效率换来了查找元素的高效率(O(logN)). 1.初始化 set<int> st; 2.begin返回第 ...

  3. C#日历上显示节气、阴阳历节假日信息

    近期在做一个工作日历,想在日历上设置工作日,显示请假.加班等相关信息,显示农历日期信息(包括农历日期.节日 .节气).公历信息(节假期). 不能不说,http://www.cnblogs.com/ho ...

  4. label标签的属性

    //label标签的属性 - (void)viewDidLoad { //初始化一个label1标签对象,初始化有很多方法,最原始的就是init,此处用带有frame的方法 UILabel *labe ...

  5. error in invoking target 'mkldflags ntcontab.o nnfgt.o' of makefile

    error in invoking target 'mkldflags ntcontab.o nnfgt.o' of makefile 今天是2013-08-04,在安装oracle11g r2 数据 ...

  6. sqlserver2012的审计功能的相关理解

    1.sqlserver2012可以做实例的审计,以及数据库的审计,基本包括了所有的操作.可以符合我们的要求.   2.审计功能需要实例级别的配置数据库级别的配置,实例上建立“审核”,数据库上建立“数据 ...

  7. Json对象直接存取数据库

    需要jar包: json.jar jackson-core.jar jacson-mapper.jar 一.ArrayList转json和hashmap转json代码一样 /**  * 把map转换成 ...

  8. 8000401a错误解决方式(Excel)

    前一阵子做开发须要用到Excel和Word编程,本人用的是Vista系统,开发环境是VS2005和Office2007,測试无不论什么问题,但是到部署的时候出现了一些令人非常头痛的问题,老是会出现比如 ...

  9. Java TCP服务端向客户端发送图片

    /** * 1.创建TCP服务端,TCP客户端 * 2.服务端等待客户端连接,客户端连接后,服务端向客户端写入图片 * 3.客户端收到后进行文件保存 * @author Administrator * ...

  10. 微信公众平台java开发具体解释(project代码+解析)

    说明: 本次的教程主要是对微信公众平台开发人员模式的解说,网络上非常多类似文章,但非常多都让初学微信开发的人一头雾水,所以总结自己的微信开发经验,将微信开发的整个过程系统的列出,并对主要代码进行解说分 ...