C++ 无限 EOF while 循环,搜索存档,没有找到类似的 [重复]

C++ infinite EOF while loop, searched archive and didn't find similar [duplicate]

提问人:commandershepard 提问时间:9/26/2020 最后编辑:commandershepard 更新时间:9/26/2020 访问量:414

问:

这是我的 CS 编程课上的一个实验室。这是我写的:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    int grade, avg, count = 0, total = 0;

    ifstream gradeFile;
    gradeFile.open("Lab9C.txt");

    gradeFile >> grade;

    while (!gradeFile.eof())
    {
        cout << "Grades: ";

        while (grade != 0)
        {
            cout << grade << " "; 
            count++;
            total = total + grade;
            avg = total / count;
            gradeFile >> grade;
        }

        cout << "Average: " << avg << endl;
    }

    gradeFile.close();
    return 0;
}

该程序应该读取文件的每一行并打印该文件中的所有成绩,然后平均成绩并打印该成绩。现在它只是在打印:成绩:平均:87 - 无限重复。我尝试将我的输入语句移动到不同的区域,例如在第一次查看和第二次查看中(使用 grade = -1 初始化循环外的 grade),无论我将该语句放在哪里,我都会得到无限循环。

我查看了 stackoverflow 上的其他 EOF 问题,它们似乎都是不同的问题。我很确定我正确地格式化了我的 eof,因为它的格式与我为这个类编写的其他 eof while 循环完全相同。那么为什么它会无限重复呢?

编辑:此分配需要 EOF 和嵌套哨兵循环。指示:

• 使用 eof 控制的 while 循环读取未知数量的行 从文本文件中,Lab9C.txt • 每行将包含测验成绩; 每行的最后一个数字将是 0。这标志着 那组测验成绩。• 使用嵌套的 while 循环(哨兵 controlled) 从文件中读取测验成绩,当它停止时 读取 0。• 在阅读时打印每个成绩并打印所有测验 在同一行上的一组中的成绩,它们之间有空格。(不要 打印 0.)• 计算一条线上测验成绩的平均值,并 将其打印在带有标签的单独行上。(使用双精度变量 这个程序。

此外,如果有帮助,这里是来自外部文件的文本,0 旨在作为“结束行”指令:

80 95 93 87 80 92 0 75 80 85 94 70 0 80 70 90 75 0 79 86 90 95 84 78 88 0 65 80 78 90 92 100 0

好的,朋友让我找到了解决方案,我应该把第一个循环放在里面。我真的很生气,因为我几乎可以肯定我已经尝试过了。叹息。无论哪种方式,它现在都可以完美运行。gradeFile >> grade;

有点恼火那个链接完全不适用的 EOF 存档帖子的人,我在这里发布之前已经阅读过该帖子,并且我已经知道它不适用。我猜有些人只是习惯性地发布它。

C++ 循环 while 循环 eof

评论

0赞 MikeCAT 9/26/2020
顺便说一句,不应该在每个内部循环之前初始化吗?counttotal
1赞 Barmar 9/26/2020
为什么 while(!feof(file)) 总是错的

答:

0赞 MikeCAT 9/26/2020 #1

未在循环中检查 EOF:

        while (grade != 0)
        {
            cout << grade << " "; 
            count++;
            total = total + grade;
            avg = total / count;
            gradeFile >> grade;
        }

因此,当它到达 EOF 时,它将在没有输入 0 的情况下运行无限循环。

另一方面,当输入时,不会再从文件中读取输入,因此不会执行 EOF 检查。这就是为什么无休止地重复。0Grades: Average: 87

要改进:

  • 检查内部循环中的 EOF。
  • 当内部循环中没有输入时,从外部循环退出。

试试这个:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    int grade, avg, count = 0, total = 0;

    ifstream gradeFile;
    gradeFile.open("Lab9C.txt");

    for(;;)
    {
        cout << "Grades: ";

        bool inputTaken = false;
        while (gradeFile >> grade) // check for EOF in the inner loop
        {
            inputTaken = true;
            if (grade == 0) break;
            cout << grade << " "; 
            count++;
            total = total + grade;
            avg = total / count;
        }
        if (!inputTaken) break; // exit from outer loop when no input is taken in inner loop

        cout << "Average: " << avg << endl;
    }

    gradeFile.close();
    return 0;
}

评论

0赞 MikeCAT 9/26/2020
@Barmar 思考如何修复...
0赞 MikeCAT 9/26/2020
@commandershepard 像这样的其他信息应该在您的问题中,而不是在评论中。
0赞 commandershepard 9/26/2020
@Barmar - 我没有包括 while (!feof(file)),因为我在 (file) 中什么都没有。如果你告诉我 (!feof()) 是错误的,那么为什么我被教导在课堂上使用它,eof 循环的替代方案是什么?
0赞 commandershepard 9/26/2020
@MikeCAT理解,我删除了评论并编辑了我的原始问题。