逐个比较两个文件 char - C 中的文件末尾错误

Comparing two files char by char - end of file error in C

提问人:Buzz Black 提问时间:10/22/2016 最后编辑:wildplasserBuzz Black 更新时间:10/22/2016 访问量:164

问:

我有一个具体的问题。我必须从两个文件中读取字符串,并逐个字符比较它们,并判断哪一行是差异以及它们相差多少个字符。我已经制作了指针和所有东西,但问题是当涉及到第一个文件的末尾时(它只需要读取较短文件的长度)我无法比较最后一个字符串,因为我的 for 循环一直持续到“\n”,而最后一行没有 \n。但另一方面,如果我在 for 循环中输入“\0”,它会给我一个错误的结果,因为它也将“\n”视为 char。我该如何处理这个问题?建议?我不想使用 strcmp(),因为我需要计算字符差异,并且还有一些其他条件需要满足。这是我的问题:

while(!feof(fPointer)){
    zeichnen = 0;
    fgets(singleLine, 150, fPointer);
    fgets(singleLine2, 150, fPointer2);
    length = strlen(singleLine);            // save the length of each row, in order to compare them
    length2 = strlen(singleLine2);
    if(length <= length2){
        for(i=0; singleLine[i] != '\n'; i++){
                singleLine[i] = tolower(singleLine[i]);
                singleLine2[i] = tolower(singleLine2[i]);
            if(singleLine[i] != singleLine2[i]){
                     zeichnen++;
                }
        }
        printf("Zeile: %d \t Zeichnen: %d\n", zeile, zeichnen);   // row, char
C 指针 char feof

评论

1赞 wildplasser 10/22/2016
注意:有两个EOF条件需要处理。注意 2:不要使用 stackoverflow.com/q/5431941/905902feof()
0赞 Buzz Black 10/22/2016
我不需要两个 EOF 条件,因为我之前已经比较了文件并决定在 while 循环中包含哪个文件,这只是我问题所在代码的一部分。
0赞 hyde 10/22/2016
注意 3:始终检查每个 IO 函数的返回值(除了定期打印到 stdio/stderr,因为 wpuld 变得比它的价值更乏味)。
0赞 melpomene 10/22/2016
@BuzzBlack还是错了。while (!feof(...))
0赞 Buzz Black 10/22/2016
好的,我明白了。 错了,但这如何解决我的问题while(!feof(...))

答:

0赞 Pauli Nieminen 10/22/2016 #1
for(i=0; i < min(length, length2); i++) {
      if ( singeLine[i] == '\n' || singleLine2[i] == '\n')
        break;
       /* Do work */
}       

另一种方法是使用逻辑和运算符来测试 for 循环条件部分中的两个或多个条件。

从 fgets 手册页:

char *fgets(char *s, int size, FILE *stream);

fgets() 在成功时返回 s,在出错或文件结束时返回 NULL 在未读取任何字符时发生。

因此,您应该有 while(true) 循环并检查两个 fgets 返回值以结束输入。