提问人:k-man 提问时间:11/29/2010 最后编辑:Jonathan Lefflerk-man 更新时间:10/11/2018 访问量:14951
如何使用feof(FILE *f)?
How to use feof(FILE *f)?
问:
我很难使用 do-while 循环,这应该停止 当我们到达文件末尾时。下面是循环代码:
do {
if (pcompanyRow[0] != '#' && pass == 1) {
strtok(pcompanyRow, ":");
pcompanyName = strcpy(pcompanyName, strtok(NULL, ""));
pass = 2;
fgets(pcompanyRow, 1024, f);
}
if (pcompanyRow[0] != '#' && pass == 2) {
strtok(pcompanyRow, ":");
pcompanySMSPrice = strcpy(pcompanySMSPrice, strtok(NULL , ""));
pass = 3;
fgets(pcompanyRow, 1024 , f);
}
if (pcompanyRow[0] != '#' && pass == 3) {
strtok(pcompanyRow, ":");
pcompanyMMSPrice = strcpy(pcompanyMMSPrice, strtok(NULL, ""));
pass = 4;
fgets(pcompanyRow, 1024, f);
}
if (pass == 4) {
AppendCompanyNode(pcompanyList, pcompanyName, pcompanySMSPrice, pcompanyMMSPrice);
pass = 1;
}
} while (!feof(f));
使用调试器运行后,我注意到我遇到的所有崩溃问题都是因为它即使到达整行也不会脱离此循环。
我应该如何正确书写?
答:
8赞
Milan
11/29/2010
#1
切勿使用 feof() 作为循环的退出指示符。feof() 仅在读取文件末尾 (EOF) 后为 TRUE,而不是在达到 EOF 时为 TRUE
来源在这里。它还详细解释了问题以及如何解决它。
评论
0赞
k-man
11/29/2010
我将while更改为:while(fgets(pcompanyRow, 1024 , f) != NULL)
0赞
k-man
11/29/2010
无论如何它不会停止!!我可以看到 pcompanyRow 值,它再次占用了第一行,它给我带来了循环中的文件行并且不会停止......我能做些什么?
1赞
William Pursell
3/26/2011
+1,但我质疑措辞。EOF 永远不会被“读取”。读取函数可能会因遇到文件末尾而返回 EOF,但 EOF 不是读取的值。
0赞
Somjit
12/14/2014
您指出的代码显示了由于 feof() 而执行的额外读取。我运行了完全相同的代码,我没有遇到这个问题。有什么想法吗?
4赞
poundifdef
11/29/2010
#2
我会改变你的循环和逻辑来使用它:
while (fgets(pcompanyRow, 1024, f) != NULL) {
/* do things */
}
当 fgets() 尝试读取文件末尾时,它将返回 NULL,您将退出循环。您仍然可以继续使用您的其他标志/逻辑,但您检查的条件将略有不同。pass
评论
0赞
EvilTeach
11/29/2010
循环完成后,您可以使用 feof(f) 来确定它是 EOF 还是错误
0赞
k-man
11/29/2010
我就是这么做的。而且它仍然不会停止!继续给我带来台词
0赞
Andrey My
10/11/2018
#3
我建议同时使用 fgets() 和 feof()。 文件中的最后一个字符串可能有 \n,也可能没有。如果仅使用 feof(),则可以跳过(丢失)最后一行。
for(;;)
{char *pc;
pc=fgets(buf,sizeof(buf),fd);
if(!pc)
{//it may be read error or end of file
if(feof(fd))
{//it is end of file, normal exit from for
break;
}
else
{//it is i/o error
fclose(fd);
return 2;
}
}
}//for
评论
fgets()
feof()
ferror(f)
!feof(f)
feof
ferror()
feof()