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