我在使用函数feof
时遇到问题,这是我的代码:
while(!feof(archlog))
{ if(!fgets(line,MAXLINE,archlog))
printf("\nERROR: Can't read on: %s\n", ARCHTXT);
else
printf("%s",line);
}
当我运行它时,它打印文件的文本但是进行额外的循环并打印出错误,我想避免这种情况,我希望它只打印文件的文本而不需要额外的循环。
答案 0 :(得分:1)
如果文件以新行结束,则循环将再次进入。
warkaround应该是:
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);
}
答案 1 :(得分:1)
一旦您的gets
函数读取EOF,就会设置EOF标志。这意味着最后一次迭代将始终触发错误消息。在此之后,循环再次测试EOF标志,该标志在最后一次读取时触发,从而退出循环。
你可以通过将EOF测试置于循环中来解决这个问题。在那里,您可以在成功读取时打印文本,也可以设置布尔值以在出现故障时退出循环。
答案 2 :(得分:0)
我总是反转两个函数调用:
while(fgets(line,MAXLINE,archlog))
{ if(feof(archlog))
break;
else
printf("%s",line);
}
当读取文件结尾时,这会让我失望。有时我'或'ferror(archlog)
feof()
来{{1}}来电,错误或EOF。
答案 3 :(得分:0)
您不应在循环中使用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)。