提问人:Paul Edward Castro Nava 提问时间:3/13/2013 最后编辑:harpunPaul Edward Castro Nava 更新时间:3/13/2013 访问量:1935
带有 EOF 的额外循环 [复制]
Extra Loop with EOF [duplicate]
问:
我在使用该函数时遇到问题,这是我的代码:feof
while(!feof(archlog))
{ if(!fgets(line,MAXLINE,archlog))
printf("\nERROR: Can't read on: %s\n", ARCHTXT);
else
printf("%s",line);
}
当我运行它时,它会打印文件的文本,但会进行额外的循环并打印错误,我想避免这种情况,我希望它只打印文件的文本而没有额外的循环。
答:
1赞
Felipe Lavratti
3/13/2013
#1
如果文件以新行结尾,则循环将再次进入。
一个 warkaround whould 是:
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);
}
0赞
Steve Valliere
3/13/2013
#2
我总是颠倒两个函数调用:
while(fgets(line,MAXLINE,archlog))
{ if(feof(archlog))
break;
else
printf("%s",line);
}
当读取文件末尾时,这让我出局。有时我会“或”加入电话,以突破错误或 EOF。ferror(archlog)
feof()
1赞
deau
3/13/2013
#3
函数读取 EOF 后,将设置 EOF 标志。这意味着最后一次迭代将始终触发错误消息。在此之后,循环再次测试EOF标志,该标志在最后一次读取时触发,因此退出循环。gets
您可以通过将 EOF 测试放在循环中来解决这个问题。在那里,您可以在成功读取时打印文本,也可以设置布尔值以在失败时退出循环。
0赞
harpun
3/13/2013
#4
你不应该在你的循环中使用,因为它只有在被读取时才返回 true,而不是到达,参见如何使用 feof(FILE *f)?feof(FILE *f)
EOF
请改用条件的 and its return code for the condition:fgets
while(fgets(line, MAXLINE, archlog) != NULL) {
printf("%s", line);
}
无需在循环内部进行检查。对于错误检查,请使用 ferror(archlog)。feof(archlog)
评论