2013-10-17 84 views
1

我很新的C和对这里显示文件的内容很简单的功能。它工作正常,除了我的文件的最后一行打印两次...我知道它必须做w/EOF,但我无法弄清楚如何让功能识别EOF作为最后一行,而不是再运行一次。我知道在互联网上有十亿个地方存在类似的问题,但是很多都是用于C++的,因为我是新手,我认为最好只使用我自己的代码。下面是代码:EOF阅读最后一行两次

{ 
    int count=0, fileEnd=0; 

    FILE* rockPtr=fopen("rockact.txt", "r"); 

    printf("\n%8s%8s%8s%8s%8s\n", "BANDID", "NAME", "SIZE", "CREW", "TRANS"); 

    do 
    { 
     fileEnd=fscanf(rockPtr, "%d%s%d%d%s", &(tempBand.rockid), tempBand.bandname, &(tempBand.bandsize), &(tempBand.crewsize), tempBand.transport); 
      if (fileEnd !=EOF); //checks EOF has not been reached 
      { 
       printf("\n%8d%8s%8d%8d%8s", tempBand.rockid, tempBand.bandname, tempBand.bandsize, tempBand.crewsize, tempBand.transport); 
       count++;     
      }    
    } 
    while (fileEnd !=EOF); 

    fclose(rockPtr); 
    printf("\n The total amount of rock acts on file is %d\n", count); 
    } 

回答

4

if条件不想要的分号:

if (fileEnd !=EOF); // This semicolon is wrong! 

分号是一个空语句,是if的身体。

我宁愿看到铸成while循环的整个循环:

while (fscanf(rockPtr, "%d%s%d%d%s", &tempBand.rockid, tempBand.bandname, 
       &tempBand.bandsize, &tempBand.crewsize, tempBand.transport)) == 5) 
{ 
    printf("\n%8d%8s%8d%8d%8s", tempBand.rockid, tempBand.bandname, 
      tempBand.bandsize, tempBand.crewsize, tempBand.transport); 
    count++;     
} 

如果你要担心,你可以当场EOF之间的差别,在循环之后读取错误和格式错误。请注意,该检查是所有值都转换成OK。

+0

非常感谢您的宝贵时间我很感激! – user2884601

1

你有;后,如果 - 删除

此外,检查手册fscanf

如果读数错误发生或达到最终的文件,而 阅读,适当的指标设置(feof或ferror)。而且,如果其中一个发生 前任何数据可以被成功读取,则返回EOF。

这意味着您可以从文件读取至少部分数据,达到EOF或错误,但fscanf不会返回它。

您应该使用feof函数来检查是否达到

文件末尾所以你的逻辑应该是:

  1. 从文件
  2. 读取如果有什么阅读 - 显示它,在这里我的意思你应该比较返回的数字与参数的数量,而不是EOF
  3. 检查费用

UPDATE:开启时/读取文件时,你应该经常检查FERROR,因为EOF是不是唯一的问题

+2

我对使用feof()建议深表怀疑,因为滥用它的方法多于使用它的方法。 –

+2

['而(!FEOF(文件))'永远是错的(http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong) –

+0

我同意,你应该检查阅读错误也在更新 –