gpt4 book ai didi

c++ - EOF,读取最后一行时永远循环。 C++

转载 作者:太空宇宙 更新时间:2023-11-03 10:28:41 25 4
gpt4 key购买 nike

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 的最后一行进入死循环,如何停止死循环?

最佳答案

这个问题不知何故设法被问到大约 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。您尝试从文件中读取下一项(但失败了)。然后您尝试处理数据,即使读取失败也是如此。

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

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

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

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

关于c++ - EOF,读取最后一行时永远循环。 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24483398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com