c-带EOF的额外回路

  • 本文关键字:回路 EOF loops feof
  • 更新时间 :
  • 英文 :


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

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

当我运行这个程序时,它会打印文件的文本,但会进行额外的循环并打印ERROR,我想避免这种情况,我希望它只打印文件的文字,而不需要额外的循环。

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

一个壁垒可能是:

while(!feof(archlog))
{  if(!fgets(line,MAXLINE,archlog))
     printf("nERROR: Can't read on: %sn", ARCHTXT);
   else
     printf("%s",line);
   if ( (c=fgetc(archlog)) == EOF)
      break;
   ungetc(c, archlog);
}

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

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

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

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

当文件的末尾被读取时,这会让我离开。有时我会在ferror(archlog)中对feof()调用"或",以爆发错误或EOF。

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

相反,对于条件使用fgets及其返回代码:

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

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

相关内容

  • 没有找到相关文章

最新更新