1

我正在从一个包含三列的文件中读取数据。例如,数据将类似于:

3  START  RED
4  END    RED

要读取数据,我使用以下检查:

while (iFile.peek() != EOF) {
   // read in column 1
   // read in column 2
   // read in column 3
}

我的问题是循环通常会执行额外的循环。我很确定这是因为很多文本编辑器似乎在实际内容的最后一行之后放了一个空行。

我做了一些谷歌搜索并在 SO 上搜索并发现了一些类似的情况,例如从文本文件中读取直到 EOF 重复最后一行,但是我似乎不太适应为解决我的问题而给出的解决方案。有什么建议么?

4

5 回答 5

4

EOF 不是预测,而是错误状态。因此,您不能像现在使用它那样使用它来预测您是否可以阅读第 1、2 和 3 列。因此,C++ 中的一个常见模式是:

while (input >> obj1 >> obj2) {
  use(obj1, obj2);
}

全部operator>>(istream& is, T&)返回输入流,并且在布尔上下文中使用时,只要最后一次提取成功,流就是“真”。然后可以安全地使用提取的对象。

于 2009-10-27T10:19:40.923 回答
2

假设iFileistream

您应该在出现任何错误时跳出循环,而不仅仅是在 EOF(可以使用iFile.eof(), BTW 检查),因为当任何格式失败将流设置为除 EOF 之外的错误状态时,这是一个无限循环。通常有必要在循环的中间,在所有内容都被读取(成功与否)之后,并且在它进入之前中断一个读取循环。

为了确保不再有任何有趣的事情发生,您可以在循环之后重置流状态,然后尝试仅读取空白,直到到达 EOF:

while( !iFile.eof() )
{
   iFile >> std::ws;
   string line;
   std::getline(iFile,line);
   if(!line.empty()) error(...);
}
于 2009-10-27T08:10:26.053 回答
0

如果任何读取失败(您读取列数据的位置),只需跳出 while 循环。大概你在文件的末尾并阅读最后一个“不正确”行

于 2009-10-27T08:01:13.810 回答
0

也许你会认为处理空格和其他无效输入是个好主意。也许对第 1、2、3 列进行一些基本验证也是可取的。

于 2009-10-27T08:05:22.090 回答
0

不必担心循环的次数:只需验证数据并处理无效输入即可。

基本上,检查您是否有三列要阅读,以及您是否不确定是因为文件结束还是因为其他问题。

于 2009-10-27T08:06:07.420 回答