ifstream识别文件结尾

时间:2017-09-03 13:43:06

标签: c++ stream eof

我有一个包含以下格式数据的文件:

name1 p1 p2 ... p11
name2 p1 p2 ... p11
...

(参数不一定在一行中)

我的目标是读取名称和11个参数,对它们执行某些操作,然后对下一个数据块执行相同操作,直到不再存在。下面的代码做得很好,但是在到达文件末尾之后,它会再执行一次读取垃圾的操作。任何人都可以帮我解决这个问题吗?

std::ifstream file("data.txt");
std::string name;
double p[11];

while(file.peek() != EOF){
    file >> name 
         >> p[0] >> p[1] >> p[2] >> p[3]
         >> p[4] >> p[5] >> p[6] >> p[7]
         >> p[8] >> p[9] >> p[10];
/* 
    doing something with the data
*/
}
file.close();

1 个答案:

答案 0 :(得分:1)

在c ++中执行此操作的常用方法是在执行提取后检查流状态:

while(file >> name 
           >> p[0] >> p[1] >> p[2] >> p[3]
           >> p[4] >> p[5] >> p[6] >> p[7]
           >> p[8] >> p[9] >> p[10]) {
/* 
    doing something with the data
*/
}

如果输入中没有更多数据或错误,循环将停止。

以下是一些有关其工作原理和原因的更多信息:

<强> std::basic_ios::operator bool