【问题标题】:How to make std::getline() include last empty line?如何使 std::getline() 包含最后一个空行?
【发布时间】:2021-01-23 04:47:41
【问题描述】:

当使用 std::getline 从文件中读取行时,我需要它来拾取文件末尾的每个空白行。


    //add each line to lines
    while (std::getline(file, line))
        lines.push_back(line);

getline() 总是跳过文件的最后一个空白行,而不是将其添加到行向量中。如果它在文件中,我需要包含最后的空白行。我该怎么做?

【问题讨论】:

  • 它不会拾取最后一个空行。 stackoverflow.com/questions/2960596/… 但我找不到解决方法。
  • 请注意,line\nline\n 现在有最后一个空白行,但这个line\nline\n\n 确实有。

标签: c++ std getline


【解决方案1】:

我想这是by design:

从输入中提取字符并将它们附加到 str 直到发生以下情况之一(按列出的顺序检查)。

a) 输入的文件结束条件,在这种情况下,getline 设置 eofbit。
...

如果由于某种原因没有提取字符(甚至没有被丢弃的分隔符),getline 设置失败位并返回。

failbit 将导致流的 bool 转换运算符返回 false,从而中断循环。

所以,我认为您必须做的是让您的循环检查是否在每次成功读取时设置了eofbit。如果设置,最后一行由 EOF 终止,而不是由换行符终止,因此不会有后续行要读取。如果不设置,不管是否为空,都会有另一行读取。

while (std::getline(file, line)) {
    lines.push_back(line);
    if (file.eof()) break;
}
if (file.eof() && file.fail()) {
    lines.push_back(“”);
}

Demo

【讨论】:

    猜你喜欢
    • 2018-01-18
    • 1970-01-01
    • 2015-07-18
    • 2015-10-18
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2016-05-30
    相关资源
    最近更新 更多