如何使用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)); 

在使用调试器运行之后,我注意到我遇到的所有崩溃问题都是因为即使它到达整行,它也不会离开这个循环。

我该怎么写得正确?

我会改变你的循环和逻辑来使用它:

 while (fgets(pcompanyRow, 1024, f) != NULL) { /* do things */ } 

当fgets()尝试读取超过文件末尾时,它将返回NULL并且您将跳出循环。 您仍然可以继续使用pass和其他标志/逻辑,但您检查的条件会略有不同。

你永远不应该使用feof()作为循环的退出指示符。 feof()仅在读取文件结束(EOF)后才为TRUE,而不是在达到EOF时

来源于此 。 它还详细解释了问题以及如何解决它。

我建议同时使用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