我在使用函数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(。