Как мне использовать write с stringstream?

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

Я старался:

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

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

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

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

3 ответа

Решение

Для "как мне это сделать" вы можете использовать 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

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

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

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

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

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

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

Параметр по умолчанию для режима 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

Другие вопросы по тегам