我遇到了一个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));在使用调试器运行后,我注意到我遇到的所有崩溃问题都是因为它在到达整个行时都没有离开这个循环。
我应该如何正确地编写它?
发布于 2010-11-29 06:12:26
我将更改您的循环和逻辑,以使用以下代码:
while (fgets(pcompanyRow, 1024, f) != NULL) {
/* do things */
}当fgets()试图读取超过文件末尾的内容时,它将返回NULL,您将中断循环。您仍然可以继续使用pass和其他标志/逻辑,但是您检查的条件将略有不同。
发布于 2010-11-29 06:01:11
您永远不应该使用feof()作为循环的退出指示器。feof()仅在读取文件结尾( EOF )后为TRUE,而不是在到达EOF时为TRUE
源here。它还详细地解释了问题以及如何解决它。
发布于 2018-10-11 16:02:43
我建议同时使用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;
}
}
}//forhttps://stackoverflow.com/questions/4299296
复制相似问题