【问题标题】:EOF, looping forever when the last line is read. c++EOF,在读取最后一行时永远循环。 C++
【发布时间】:2014-06-30 05:23:38
【问题描述】:
void ReadTheData(ifstream& in_stream, ofstream& out_stream)
{
    using namespace std;
    int id;
    char name[100] = "";
    double balance;
    in_stream >> id >> name >> balance;
    while(name[0] || ! in_stream.eof()) // Continue looping until eof or name is not      present.

    {
        cout << id << '\t' << name << '\t' << balance << endl;
        in_stream >> id >> name >> balance;
    }

}

the Balance.txt has format style:
4248749 Kelly_E     460.02
8898693 Kelly_George_MD 1764.68
4597789 Lambert_Richard 1571.79

当我运行代码时,文件 Balance.txt 中的最后一行进入了无限循环,如何停止无限循环?

【问题讨论】:

标签: c++ eof


【解决方案1】:

不知何故,这个问题设法被问到了大约 100 种不同的方式,其中没有一种是 相当 与其他的重复。更糟糕的是,每次被问到时,它都会得到大量的糟糕答案。

要从流中正确读取数据,您需要一个具有单个条件的循环来读取数据检查读取尝试是否成功。几乎任何其他事情都容易失败。特别是,几乎不可能得到表单的循环:

while (!foo.eof())

或:

while (!foo.bad())

或:

while (foo.good())

或:

while (file)

...实际正常工作。这些中的每一个都从根本上被破坏了。获得正确结果的简单方法是将读取和测试合并到一个操作中,例如:

while (std::getline(somefile, somestring))

或:

while (file >> a >> b >> c)

至于为什么这些工作而其他工作不工作:没有在文件指针到达文件末尾时立即检测到文件结尾。相反,当您尝试读取某些内容时会检测到它,但文件指针已经在文件末尾。

所以,当您读取文件中的所有数据时,file.eof() 仍然为 false。您尝试从文件中读取下一项(但失败)。然后,即使读取失败,您也尝试处理数据。

我推荐的表单正常工作的原因是它们尝试读取数据,然后检查是否成功,如果尝试读取失败则立即退出循环,因此它们尝试处理读取尝试失败后的数据。

作为一个单独的(但密切相关的)点:如果您尝试读取整个文件,您确实通常希望专门在检测文件结尾时退出循环.只要您可以转换输入,您就想阅读,并在失败时立即退出循环。

当/如果您在到达文件末尾之前遇到一些 other 错误时,这些会有所不同。在这种情况下,一个专门等待文件结束的循环可以(并且通常会)无限期地继续运行,重复尝试已经失败的操作,但失败的方式是循环未被写入以正确检测。

使用file.eof() 的时间是您退出循环之后,并且想要检测为什么退出循环。如果您已达到 eof,那太好了——您只需阅读所有数据。如果您希望循环读取整个文件,但它在到达 eof 之前就退出了,那么您可能遇到了问题 - 可能是磁盘驱动器的问题,或者可能只是文件中的错误数据。您通常可以使用file.eoffile.failfile.bad 来整理您遇到的错误类型(如果有的话)。

【讨论】:

  • 谢谢先生。正确的布尔表达式后的前两段帮助我理解
【解决方案2】:

当您尝试使用阅读时

in_stream >> id >> name >> balance;

读完最后一行后,failbiteofbit 最有可能被设置。您可以使用istream::good() 来检测istream 是否仍处于有效状态。

换行

while(name[0] || ! in_stream.eof())

while(in_stream.good())

while(in_stream)

【讨论】:

  • @DavidHang,我不明白。
  • 代码运行良好。 failbit 和 eofbit 是什么意思?我不明白你的解释。
  • 这段代码在某些时候可以工作,具体取决于正在读取的数据的确切类型。但是,当/如果数据类型发生变化时,它可能会莫名其妙地失败——因为它一开始并不是真正正确的,而且只是偶然发生的。
猜你喜欢
  • 2012-09-14
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多