我在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));
运行调试器之后,我注意到我遇到的所有崩溃问题都是因为即使它到达整行,它也不会离开这个循环。
我应该怎样写得正确?
答案 0 :(得分:8)
你永远不应该使用feof()作为循环的退出指示符。 feof()仅在读取文件结束(EOF)后才为TRUE,而不是在达到EOF时
来源here。它还详细解释了问题以及如何解决它。
答案 1 :(得分:4)
我会改变你的循环和逻辑来使用它:
while (fgets(pcompanyRow, 1024, f) != NULL) {
/* do things */
}
当fgets()尝试读取超过文件末尾时,它将返回NULL并且您将跳出循环。您仍然可以继续使用pass
和其他标志/逻辑,但您检查的条件会略有不同。
答案 2 :(得分:0)
我建议同时使用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