【发布时间】:2016-02-08 09:49:18
【问题描述】:
我正在尝试让我的程序从数据 (.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 循环时,我都必须阅读不止一行。
【问题讨论】:
-
首先,
eofbit标志在您尝试从文件末尾之外读取之前不会设置,这意味着您的循环不会像您期望的那样工作。要继续,请尝试在调试器中逐行执行代码,您的阅读也不会像您预期的那样工作。 -
@JoachimPileborg 好的,第一个
get()调用(在while 循环之前)将key设置为正确的值,但之后的每个get()调用都将key设置为“”。我假设这是因为程序从不读取文件中的第一个 '\n' 字符。你知道我会怎么解决这个问题吗? -
最简单的解决方案?使用
std::string和std::getline读取行数。 -
“所以我当然使用循环条件 while(!file.eof())”——这是不正确的……
-
@LarryK - 在你解决了
file.get()问题之后,while (!file.eof())仍然是错误的(即使这不是你问的问题)。