带有 EOF 的额外循环 [复制]

Extra Loop with EOF [duplicate]

提问人:Paul Edward Castro Nava 提问时间:3/13/2013 最后编辑:harpunPaul Edward Castro Nava 更新时间:3/13/2013 访问量:1935

问:

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

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

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

C 循环 feof

评论

2赞 GodMan 3/13/2013
你可以在这里找到答案:stackoverflow.com/questions/5431941/......

答:

1赞 Felipe Lavratti 3/13/2013 #1

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

一个 warkaround whould 是:

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);
}
0赞 Steve Valliere 3/13/2013 #2

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

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

当读取文件末尾时,这让我出局。有时我会“或”加入电话,以突破错误或 EOF。ferror(archlog)feof()

1赞 deau 3/13/2013 #3

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

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

0赞 harpun 3/13/2013 #4

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

请改用条件的 and its return code for the condition:fgets

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

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