1

我想编写一个程序来比较两个文件并将文件一中与文件二不同的每个字节写入第三个文件。我想逐字节比较文件并将任何不同的单个字节写入第三个文件。我对文件 I/O 不是很熟悉。有人可以给我一个完成这项任务的示例程序吗?

这是我到目前为止所拥有的:

int main(int argc, char *argv[]) {
  int file1, file2, file1size, file2size;
  // int  difference1, difference2;
  char buf;

  if (argc != 3){
    fprintf(stderr, "Usage %s <file1> <file2>", argv[0]);
    exit(1);
  }
  if ((file1 = open(argv[1], 0400)) < 0) { //read permission for user on file source
    fprintf(stderr, "Can't open source");
    exit(1);
  }
  if ((file2 = open(argv[2], 0400)) < 0) { //read permission for user on file source
    fprintf(stderr, "Can't open source");
    exit(1);
  }
  file1size = lseek(file1, (off_t) 0, SEEK_END);
  printf("File 1's size is %d\n", file1size);
  file2size = lseek(file2, (off_t) 0, SEEK_END);
  printf("File 2's size is %d\n", file2size);



}

我不确定如何比较 file1 和 file2 的字节,然后将差异写入另一个文件。

4

2 回答 2

2

这做你想要的,编译和运行,

#include <stdio.h>
int main(int argc, char *argv[])
{
    int offset;
    int argi=1;
    int ch1, ch2;
    FILE *fh1, *fh2, *fh3=stdout;
        FILE *fh4=stdout;
    if( argc<3 ) {
        printf("usage: diff <file> <file> { <outfile> }\n"); return(1);
    }
    if(argi<argc) {
        if(!(fh1 = fopen(argv[argi], "r"))) {
            printf("cannot open %s\n",argv[argi]); return(2);
        }
    }
    if(++argi<argc) {
        if(!(fh2 = fopen(argv[argi], "r"))) {
            printf("cannot open %s\n",argv[argi]); return(3);
        }
    }
    if(++argi<argc) {
        if(!(fh3 = fopen(argv[argi], "w+"))) {
            printf("cannot open %s\n",argv[argi]); return(4);
        }
    }
        if(++argi<argc) {
            //duplicate output to a second file?
            if(!(fh4 = fopen(argv[argi], "r"))) {
                printf("cannot open %s\n",argv[argi]); return(3);
            }
        }
    for(offset = 0; (!feof(fh1)) && (!feof(fh2)); offset++)
    {
        ch1=ch2='-';
        if(!feof(fh1)) ch1 = getc(fh1);
        if(!feof(fh2)) ch2 = getc(fh2);
        if(ch1 != ch2) {
            fprintf(fh3,"%d:%c %c\n", offset, ch1, ch2);
            //additional file here
        }
        else {
            fprintf(fh3,"%c\n", ch1);
            //additional file here
        }
    }
    return 0;
}

更典型的是,您将使用 fgets 读取整行,并使用 strcmp 来比较这些行。这里是如何,

    char str1[1024], str2[1024];
    ...
    for(offset = 0; (!feof(fh1)) && (!feof(fh2)); offset++)
    {
        strcpy(str1,"-");strcpy(str2,"-");
        if(!feof(fh1)) fgets(str1,sizeof(str1),fh1);
        if(!feof(fh2)) fgets(str2,sizeof(str1),fh2);
        if(strcmp(str1,str2)!=0) 
            fprintf(fh3,"%d:%s  %s", offset, str1, str2);
        else
            fprintf(fh3,"%c", str1);
    }
于 2013-10-29T02:02:10.377 回答
2

这与您正在寻找的内容很接近。

#include <stdio.h>

int main(int argc, char *argv[]) {
    FILE *file1 = fopen(argv[1], "r");
    FILE *file2 = fopen(argv[2], "r");
    int i;
    for(i = 0; !feof(file1) || !feof(file2); i++) {
        int byte1 = getc(file1);
        int byte2 = getc(file2);
        if(byte1 != byte2) {
            printf("%d %d %d\n", i, byte1, byte2);
        }
    }
    return 0;
}

它将这两个文件作为命令行参数并逐字节比较这两个文件。如果两个字节不同,则打印字符#,以及这两个字符的ASCII 值。-1 表示已经达到 EOF。

您必须(理解并)将其调整为您想要的输出格式。(我假设这是家庭作业。)

feof测试文件结束。

getc从文件中获取下一个字符(字节)。如果已到达文件末尾,则为 -1。

你似乎已经知道是什么printf

于 2013-10-29T01:43:45.637 回答