Как считать весь поток в станд.:: строка?

Я пытаюсь считать весь поток (несколько строк) в строку.

Я использую этот код, и он работает, но он нарушает мое чувство стиля... Конечно, существует более легкий путь? Возможно, с помощью 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.


На самом деле, a const ссылка на строку сделала бы также, и это может сделать вещи легче...
const std::string &s(... a miracle occurs here...)
68
задан Mark Ingram 13 November 2017 в 20:20
поделиться

3 ответа

Как насчет

std::istreambuf_iterator<char> eos;
std::string s(std::istreambuf_iterator<char>(stream), eos);

(можно было бы сделать однострочным, если бы не MVP)

после редактирования 2011 года, этот подход теперь пишется

std::string s(std::istreambuf_iterator<char>(stream), {});
107
ответ дан 24 November 2019 в 14:10
поделиться

Можно сделать

std::string s;
std::ostringstream os;
os<<stream.rdbuf();
s=os.str();

но я не знаю, будет ли это эффективнее.

Альтернативная версия:

std::string s;
std::ostringstream os;
stream>>os.rdbuf();
s=os.str();
18
ответ дан 24 November 2019 в 14:10
поделиться

Вы можете попробовать использовать что-то из алгоритмов. Мне нужно собираться на работу, но вот очень быстрая попытка (должен быть лучший способ):

copy( istreambuf_iterator<char>(stream), istreambuf_iterator<char>(), back_inserter(s) );
11
ответ дан 24 November 2019 в 14:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: