Я пытаюсь считать весь поток (несколько строк) в строку.
Я использую этот код, и он работает, но он нарушает мое чувство стиля... Конечно, существует более легкий путь? Возможно, с помощью stringstreams?
void Obj::loadFromStream(std::istream & stream)
{
std::string s;
std::streampos p = stream.tellg(); // remember where we are
stream.seekg(0, std::ios_base::end); // go to the end
std::streamoff sz = stream.tellg() - p; // work out the size
stream.seekg(p); // restore the position
s.resize(sz); // resize the string
stream.read(&s[0], sz); // and finally, read in the data.
const
ссылка на строку сделала бы также, и это может сделать вещи легче... const std::string &s(... a miracle occurs here...)
Как насчет
std::istreambuf_iterator<char> eos;
std::string s(std::istreambuf_iterator<char>(stream), eos);
(можно было бы сделать однострочным, если бы не MVP)
после редактирования 2011 года, этот подход теперь пишется
std::string s(std::istreambuf_iterator<char>(stream), {});
Можно сделать
std::string s;
std::ostringstream os;
os<<stream.rdbuf();
s=os.str();
но я не знаю, будет ли это эффективнее.
Альтернативная версия:
std::string s;
std::ostringstream os;
stream>>os.rdbuf();
s=os.str();
Вы можете попробовать использовать что-то из алгоритмов. Мне нужно собираться на работу, но вот очень быстрая попытка (должен быть лучший способ):
copy( istreambuf_iterator<char>(stream), istreambuf_iterator<char>(), back_inserter(s) );