我总是使用这种方法
int c;
while ((c = fgetc(fp))!=EOF)
{
printf("%c", c);
}
在我看来,它更具可读性和强大性。但是对我的回答link,chux评论说
if(feof(fp))比...更健壮 int c; while((c = fgetc(fp))!= EOF)
作为
while(1)
{
c = fgetc(fp);
if ( feof(fp) )
{
break ;
}
printf("%c", c);
}
比第一个版本更强大。那么我应该使用什么版本?请解释一下为什么该版本更好。
修改
在问题Why is “while ( !feof (file) )” always wrong?中,有人问为什么控制循环中的feof()总是错误的。但是以正确的方式检查feof()
条件是否总是错误的?解释很明显。
答案 0 :(得分:5)
我通常像这样编写输入循环:
int c;
while (c = fgetc(fp), c != EOF) {
/* do something with c here */
}
/* check if EOF came from an end-of-file or an error */
if (ferror(fp)) {
/* error handling here */
}
通常不应该使用这样的循环条件:
while (!feof(fp)) {
/* do stuff */
}
或
for (;;) {
c = fgetc(fp);
if (feof(fp))
break;
}
因为遇到IO错误时会中断。在这种情况下,fgetc
返回EOF
,但未设置文件结束标志。您的代码可能会进入无限循环,因为错误条件通常会持续存在,直到执行外部操作。
正确的方法是检查fgetc()
的结果:如果它等于EOF
,您通常可以在IO错误和结束时停止读取更多数据在文件条件下,通常无法读取更多数据。然后,您应检查是否发生错误并采取适当的措施。
答案 1 :(得分:1)
建议的改进并不是更好,甚至更不稳健。
如解释here,如果发生读取错误(没有eof),它会进入无限循环。在这种情况下,feof
会返回0
而fgetc
会返回EOF
。
您的版本没有此问题。
此外,您的版本更短,更简单,更标准。