Как мне использовать write с stringstream? - PullRequest
4 голосов
/ 17 ноября 2011

У меня есть vector<char> данных, которые я хочу записать в std::stringstream.

Я пытался:

my_ss.write(vector.data(), vector.size());

... но, похоже, ничего не вкладывается в my_ss, который я объявил следующим образом:

std::stringstream my_ss( std::stringstream::binary);

Почему запись не работает (приложение не падает и компилируется с 0 ошибками, 0 предупреждениями)?

Ответы [ 3 ]

8 голосов
/ 17 ноября 2011

Для «как мне это сделать» вы можете использовать std::ostream_iterator:

std::copy(vector.begin(), vector.end(), std::ostream_iterator<char>(my_ss));

Полный пример:

#include <iterator>
#include <sstream>
#include <vector>
#include <iostream>
#include <algorithm>

int main() {
  std::vector<char> vector(60, 'a');
  std::ostringstream my_ss;
  std::copy(vector.begin(), vector.end(), std::ostream_iterator<char>(my_ss));
  std::cout << my_ss.str() << std::endl;
}

Вы также можете просто использовать это для построенияstring напрямую, без прохождения через stringstream:

std::string str(vector.begin(), vector.end()); // skip all of the copy and stringstream
4 голосов
/ 17 ноября 2011

Хотя вы и не дали никакого кода, похоже, вы просто написали:

std::stringstream my_ss (std::stringstream::binary);

Если вы хотите записать в поток строк, вам нужно объединить флаг std::stringstream::out в конструкторе. Если я прав, то вы бы увидели, что все работает нормально, если бы вы изменили это на:

std::stringstream my_ss (std::stringstream::out | std::stringstream::binary);

(Очевидно, что если вы хотите читать из этого потока строк, вам нужно добавить std::stringstream::in)

ОБНОВЛЕНИЕ Теперь, когда вы дали свой код ... да, это ваша конкретная проблема. Обратите внимание на замечание @ awoodland о том факте, что вместо этого вы можете просто создать строку из вектора символов (если это единственное, что вы планировали сделать с этим потоком.)

3 голосов
/ 17 ноября 2011

Параметр по умолчанию для режима stringbuf в stringstream отсутствует | in.

explicit basic_stringstream(ios_base::openmode _Mode =
    ios_base::in | ios_base::out)
    : _Mybase(&_Stringbuffer),
        _Stringbuffer(_Mode)
    {   // construct empty character buffer
    }

Вам необходимо добавить stringstream :: out, если вы явно передаете что-то вроде stringstream: binary

Или просто используйте std :: ostringstream

...