0

我在使用函数时遇到问题feof,这是我的代码:

while(!feof(archlog))
{  if(!fgets(line,MAXLINE,archlog))
     printf("\nERROR: Can't read on: %s\n", ARCHTXT);
   else
     printf("%s",line);
}

当我运行它时,它会打印文件的文本,但会产生一个额外的循环并打印错误,我想避免这种情况,我希望它只打印文件的文本而没有额外的循环。

4

4 回答 4

1

如果文件以新行结尾,则循环将再次进入。

一个解决方法应该是:

while(!feof(archlog))
{  if(!fgets(line,MAXLINE,archlog))
     printf("\nERROR: Can't read on: %s\n", ARCHTXT);
   else
     printf("%s",line);

   if ( (c=fgetc(archlog)) == EOF)
      break;
   ungetc(c, archlog);
}
于 2013-03-12T17:52:04.023 回答
1

gets一旦您的函数读取 EOF,就会设置 EOF 标志。这意味着最后一次迭代将始终触发错误消息。此后,循环再次测试 EOF 标志,该标志在最后一次读取时触发,因此退出循环。

您可以通过将 EOF 测试放在循环中来解决此问题。在那里,您可以在成功读取时打印文本,或者在失败时设置布尔值以退出循环。

于 2013-03-12T17:55:35.687 回答
0

我总是颠倒这两个函数调用:

while(fgets(line,MAXLINE,archlog))
{  if(feof(archlog))
     break;
   else
     printf("%s",line);
}

当读取文件末尾时,这让我退出。有时我会“或”ferror(archlog)加入feof()通话,以在错误或 EOF 时中断。

于 2013-03-12T17:55:25.617 回答
0

你不应该feof(FILE *f)在你的循环中使用它,因为它只有在EOF被读取而不是到达时才返回 true,请参阅如何使用 feof(FILE *f)?

而是使用fgets条件及其返回码:

while(fgets(line, MAXLINE, archlog) != NULL) {
    printf("%s", line);
}

无需检查feof(archlog)循环内部。对于错误检查,请使用ferror(archlog)

于 2013-03-12T18:03:40.820 回答