1

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

 {
    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

2 回答 2

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、读取错误和格式错误之间的区别。请注意,检查是所有值都转换正常。

于 2013-10-17T18:16:05.970 回答
1

你有;if - 删除它

另外,检查fscanf的手册

如果发生读取错误或读取时到达文件结尾,则设置正确的指示符(feof 或 ferror)。并且,如果任何数据可以成功读取之前发生任何一种情况,则返回 EOF。

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

您应该使用feof函数来检查是否到达文件末尾

所以你的逻辑应该是:

  1. 从文件中读取
  2. 如果读取了任何内容 - 显示它,这里我的意思是您应该将返回的数字与参数数量进行比较,而不是与 EOF
  3. 检查 feof

更新:在打开/读取文件期间,您应该始终检查 ferror,因为 EOF 不是唯一的问题

于 2013-10-17T18:17:23.593 回答