如何确定提取了std :: getline()个字符?

时间:2018-12-08 17:58:13

标签: c++ iostream

假设我通过使用std::getline()重载从std::string中读取了std::istream。如何确定从流中提取了多少个字符? std::istream::gcount()不能按照此处的讨论进行操作:ifstream gcount returns 0 on getline string overload

#include <iostream>
#include <sstream>
#include <string>

int main()
{
    std::istringstream s( "hello world\n" );
    std::string str;
    std::getline( s, str );
    std::cout << "extracted " << s.gcount() << " characters" << std::endl;
}

Live example

请注意,对于下降投票者-字符串的长度不是答案,因为std::getline()可能会也可能不会从流中提取其他字符。

1 个答案:

答案 0 :(得分:5)

执行此操作的方法似乎并不完全简单,因为std::getline可能(也可能不会)读取终止定界符,无论哪种情况都不会将其放入字符串中。因此,字符串的长度不足以准确告诉您读取了多少个字符。

您可以测试eof()来查看是否读取了分隔符:

std::getline(is, line);

auto n = line.size() + !is.eof();

将它包装在一个函数中会很好,但是如何传递回额外的信息呢?

我想的一种方法是,如果读取了分隔符,则将其添加回去,并让调用者对其进行处理:

std::istream& getline(std::istream& is, std::string& line, char delim = '\n')
{
    if(std::getline(is, line, delim) && !is.eof())
        line.push_back(delim); // add the delimiter if it was in the stream

    return is;
}

但是我不确定我会一直想要那个。