我在使用函数时遇到问题feof
,这是我的代码:
while(!feof(archlog))
{ if(!fgets(line,MAXLINE,archlog))
printf("\nERROR: Can't read on: %s\n", ARCHTXT);
else
printf("%s",line);
}
当我运行它时,它会打印文件的文本,但会产生一个额外的循环并打印错误,我想避免这种情况,我希望它只打印文件的文本而没有额外的循环。
如果文件以新行结尾,则循环将再次进入。
一个解决方法应该是:
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);
}
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)。