【问题标题】:Skip line reading file with string::getline in C++在 C++ 中使用 string::getline 跳过行读取文件
【发布时间】:2014-01-04 01:19:06
【问题描述】:

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

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

【问题讨论】:

  • 请添加更多代码,以便更好地理解您的问题。
  • 同一行出现两次——你为什么这么认为?

标签: c++ fstream stdstring


【解决方案1】:

简单地说,它没有。

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

只有在 second 迭代和 second 调用 getline 之后,才会在流上设置 EOF 并且 .find() 操作失败。

EOF 标志没有在到达 EOF 时设置,但是在尝试读取过去的 EOF 失败之后。

这样写:

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

哎呀!现在你的循环体是空的,还有更好的写法。

也许:

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

这样更好。 =)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 你应该这样做while (std::getline(file, line) && line.find("#") != std::string::npos) {...}
    • @0x499602D2 如果我这样做会有什么不同?
    • 好吧,使用file.good() 作为您的条件是错误的,因为检索输入并非旨在以这种方式完成。此外,创建一个完整的块只是为了放置getline(..) 是不必要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2016-07-15
    • 2015-01-21
    • 2012-06-17
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多