使用C ++中的string :: getline跳过行读取文件

时间:2014-01-04 01:19:06

标签: c++ fstream stdstring

我正在使用以下代码从文件中获取行,直到找不到“#”。它有效,但我不明白为什么它获得两次相同的行。我如何避免它,即在调用string :: find(...)之后跳过一行?

do {
    getline(file, line);
} while(line.find("#") != string::npos);

2 个答案:

答案 0 :(得分:1)

简单地说,它没有。

您没有对输入结束进行任何检查。

仅在第二次迭代之后,第二次调用getline后,才会在流上设置EOF并{{ 1}}操作失败。

当达到EOF时,EOF标志设置,但尝试读取过去EOF后失败。

写下这个:

.find()

糟糕!现在你的循环体是空的,有更好的方法来写这个。

也许:

do {
} while (getline(file, line) && line.find("#") != string::npos);

那更好。 =)

答案 1 :(得分:0)

在检查返回的字符串之前,您应该检查是否已到达文件的末尾。

do {
    getline(file, line);
} while(file.good() && line.find("#") != string::npos);