gpt4 book ai didi

c++ - 为什么 eof() 永远不会返回 true?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:01:12 24 4
gpt4 key购买 nike

我试图让我的程序从数据 (.dat) 文件(实际上只是一个文本文件)中读取数据。所以我当然使用循环条件 while(!file.eof()),但这永远不会返回 true。这是我的功能:

void Table::readIn(const char finput[]){
std::ifstream file;

file.open(finput);

if (!file.is_open())
{
std::cout << "Cannot open " << finput << std::endl;
return;
}
char key[100];
file.get(key, 99, '\n');
while (!file.eof())
{
stock * item = new stock;
item->setTick(key);
file.get(key, 99, '\n');
item->setName(key);
file.get(key, 99, '\n');
item->setValue(atof(key));
file.get(key, 99, '\n');
item->setDate(key);
file.get(key, 99, '\n');
item->setYearReturn(atof(key));
file.get(key, 99, '\n');
addStock(item);
}
}

这是我的数据文件中的内容:

TSLA
Tesla Motors, Inc.
30160000000
November 6, 2015
13.1

我希望我能给你们更多的信息,但我对这个问题只知道程序无限循环通过 while (!file.eof()) 循环。

编辑:我通过调试器运行它,在 while 循环的每一行都有一个断点。我发现第一个 get() 调用(在 while 循环之前)将 key 设置为正确的值,但是每个 get() 调用之后将 key 设置为 ""。我假设这是因为程序从不读取文件中第一个 '\n' 字符。你们知道如何解决这个问题吗?

编辑 2:这个问题不同于:Why is iostream::eof inside a loop condition considered wrong?因为每次运行 while 循环时我都必须阅读不止一行。

最佳答案

您使用 std::istream::get 的问题是它不消耗定界符。它在第一次调用时工作正常,但下一次调用将立即看到上一次调用遗留下来的换行符,而不是读取任何内容。

如果你想读取行,要么使用 std::istream::getline (如果你坚持使用字符数组)或 std::getlinestd::string这是我的建议。


您也不需要明确的 eof 检查,而是依赖于所有函数返回(对)流的事实,并且流可以是 used directly in conditions。 ,例如也是如此

if (!std::getline(...))
// end of file or error

关于c++ - 为什么 eof() 永远不会返回 true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33580500/

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