【问题标题】:EOF reading last line twiceEOF 读取最后一行两次
【发布时间】:2013-10-17 18:03:19
【问题描述】:

我对 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);
    }

【问题讨论】:

    标签: c printing eof


    【解决方案1】:

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

    【讨论】:

    • 非常感谢您的宝贵时间!
    【解决方案2】:

    你有; if - 删除它

    另外,请查看fscanf 的手册

    如果发生读取错误或到达文件结尾同时 阅读时,设置了正确的指标(feof 或 ferror)。而且,如果有的话 发生可以成功读取任何数据之前,返回 EOF。

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

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

    所以你的逻辑应该是:

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

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

    【讨论】:

    • 我对“使用feof()”的建议深表怀疑,因为滥用它的方法比正确使用它的方法多得多。
    • 我同意你也应该检查阅读错误,更新
    猜你喜欢
    • 2018-01-08
    • 2021-12-05
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    相关资源
    最近更新 更多