Как определить, сколько символов `std :: getline ()` извлечено? - PullRequest
0 голосов
/ 08 декабря 2018

Допустим, я прочитал std::string из std::istream, используя перегрузку std::getline().Как определить, сколько символов извлечено из потока?std::istream::gcount() не работает, как описано здесь: ifstream gcount возвращает 0 при перегрузке строки getline

#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;
}

Пример в реальном времени

Обратите внимание, для downvoters - длина строки не является ответом, так как std::getline() может извлекать или не извлекать дополнительные символы из потока.

1 Ответ

0 голосов
/ 08 декабря 2018

Казалось бы, способ сделать это не совсем прост, потому что 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;
}

Но я не уверен, что всегда хотел бы этого.

...