Как мне использовать 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