【问题标题】:Extra Loop with EOF [duplicate]带有EOF的额外循环[重复]
【发布时间】:2013-03-12 17:38:30
【问题描述】:

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

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

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

【问题讨论】:

标签: c loops feof


【解决方案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);
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      当读取文件末尾时,这让我明白了。有时我会在 ferror(archlog) 中“或”到 feof() 调用,以在错误或 EOF 时中断。

      【讨论】:

        【解决方案4】:

        你不应该在你的循环中使用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)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-22
          • 1970-01-01
          • 2012-08-10
          • 2015-02-12
          • 2010-12-04
          • 2016-06-21
          • 2013-01-25
          • 1970-01-01
          相关资源
          最近更新 更多