如何使用feof(FILE * f)?

时间:2010-11-28 21:50:23

标签: c loops while-loop eof feof

我在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));

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

我应该怎样写得正确?

3 个答案:

答案 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