带EOF的额外循环

时间:2013-03-12 17:38:31

标签: c loops feof

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

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

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

4 个答案:

答案 0 :(得分:1)

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

warkaround应该是:

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);
}

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我总是反转两个函数调用:

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

当读取文件结尾时,这会让我失望。有时我'或'ferror(archlog) feof()来{{1}}来电,错误或EOF。

答案 3 :(得分:0)

您不应在循环中使用feof(FILE *f),因为只有在读取EOF但未达到时才返回true,请参阅How to use feof(FILE *f)?

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

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

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