1

我的程序比较两个文本文件并将文件一中的差异放入第三个文本文件中。但是,当我的文件 1 的大小大于我的文件 2 的大小时,“ÿ”字符将放置在第三个文件的末尾。例如,假设文件一包含“我喜欢泡菜”。文件二由“我喜欢狗”组成。那么第三个文件将包含“pickles.ÿ”。有没有办法摆脱这个?为什么会这样?这是我的程序:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{

    int ch1, ch2;
    int size1, size2;
    FILE *fh1, *fh2, *diffone=stdout;

    if( argc<3 ) {
        printf("need two file names\n"); return(1);
    }
    if(!(fh1 = fopen(argv[1], "r"))) {
        printf("cannot open %s\n",argv[1]); return(2);
    }
    if(!(fh2 = fopen(argv[2], "r"))) {
        printf("cannot open %s\n",argv[2]); return(3);
    }
    if(argc>3) {
        if(!(diffone = fopen(argv[3], "w+"))) {
            printf("cannot open %s\n",argv[3]); return(4);
        }
    }

    fseek(fh1, 0, SEEK_END);
    size1 = ftell(fh1);//gets size of fh1
    fseek(fh1, 0, SEEK_SET);

    fseek(fh2, 0, SEEK_END);
    size2 = ftell(fh2);//gets size of fh2
    fseek(fh2, 0, SEEK_SET);

    while((!feof(fh1)) || (!feof(fh2)))
    {
        ch1=ch2='-';
        if(!feof(fh1)) ch1 = getc(fh1);
        if(!feof(fh2)) ch2 = getc(fh2);
    if (size2 > size1)
      {
        if(ch1 != ch2 && (!feof(fh1)))
          {
        fprintf(diffone,"%c", ch1);
          }
      }
    else 
      {
        if (ch1 != ch2)
          {
        fprintf(diffone,"%c", ch1);
          }
      }

    }
}
4

4 回答 4

3

feof()仅在返回 EOF (-1)true后返回。fgetc()

请参阅为什么“while (!feof (file))”总是错误的?

于 2013-11-01T20:31:33.380 回答
0

您没有对 进行任何错误检查,也没有在whenfgetc()上检查 EOF 。fh2size1 > size2

试试这个:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int ch1, ch2;
    int eof1 = 0, eof2 = 0;
    FILE *fh1, *fh2, *diffone=stdout;

    if (argc < 3) {
        printf("need two file names\n");
        return(1);
    }
    if (!(fh1 = fopen(argv[1], "r"))) {
        printf("cannot open %s\n",argv[1]);
        return(2);
    }
    if (!(fh2 = fopen(argv[2], "r"))) {
        printf("cannot open %s\n",argv[2]);
        return(3);
    }
    if (argc > 3) {
        if (!(diffone = fopen(argv[3], "w+"))) {
            printf("cannot open %s\n",argv[3]);
            return(4);
        }
    }

    while(1)
    {
        if (!eof1) {
            ch1 = fgetc(fh1);
            if (ch1 == EOF) {
                if (ferror(fh1)) {
                    printf("cannot read from %s\n",argv[1]);
                    return(5);
                }
                eof1 = 1;
            }
        }
        else {
          ch1 = '-';
        }

        if (!eof2) {
            ch2 = fgetc(fh2);
            if (ch2 == EOF) {
                if (ferror(fh2)) {
                    printf("cannot read from %s\n",argv[2]);
                    return(6);
                }
                eof2 = 1;
            }
        }
        else {
            ch2 = '-';
        }

        if ((eof1) && (eof2))
            break;

        if ((ch1 != ch2) || (eof1 != eof2)) {
            if (fputc(ch1, diffone) == EOF) {
                if (argc > 3) {
                    printf("cannot write to %s\n",argv[3]);
                }
                return(7);
            }
        }
    }
    return 0;
}
于 2013-11-01T20:47:05.277 回答
0

每个fgetc(). _
避免使用feof(). 在第一次从读取中返回 EOF, Recallfeof()变为 true 。

代替

while((!feof(fh1)) || (!feof(fh2))) {
    if(!feof(fh1)) ch1 = getc(fh1);
    if(!feof(fh2)) ch2 = getc(fh2);

利用

 while (1) {
   ch1 = fget(fh1);
   ch2 = fget(fh2);
   if (ch1 == EOF) { 
     if (ch2 == EOF) break;
     ch1 = '-';
   }
   if (ch2 == EOF) { 
     ch2 = '-';
   }
   ....
 }
于 2013-11-01T20:52:52.363 回答
0

例如,当您尝试先从文件中获取然后打印时会出现此问题 -

ch=fgetc(fp2);
while(ch!=EOF)
{   
    ch = fgetc(fp2);
    fputc(ch, fp1);     
}

而是做-

ch=fgetc(fp2);
while(ch!=EOF)
{   
   fputc(ch, fp1);
   ch = fgetc(fp2);
}
于 2016-08-24T17:25:33.617 回答