Почему stringstream :: str () усекает строку?

У меня есть объект stringstream. Заполнено через

stringstream ss;
boost::iostreams::copy(inp,ss);

от

boost::iostreams::filtering_streambuf<boost::iostreams::input> inp;

и фактически содержит разархивированный файл внутри.

Теперь, если я сбрасываю содержимое потока строк в файл с

std::ofstream ofs(path_to_file,std::ios_base::out|std::ios_base::binary);
ofs << ss.rdbuf();

все отлично. Файл заполнен полными правильными данными.

Но если я вместо сброса в файл конструировать строку, как это

std::string s = ss.str();

контент усекается где-то посередине. Это не постоянная ошибка, и она, очевидно, зависит от содержимого строкового буфера.

Содержимое файла HTML на нескольких языках.

Что это может быть? Благодарю.

1

Решение

Как вы определяете, что контент урезан? stringstream может содержать нулевые символы и std::string s = ss.str() скопирует эти нулевые символы и символы после него в std::string объект.

Однако, если вы затем используете функции, которые обрабатывают std::string содержимое объекта в виде строки стиля C, оно будет выглядеть усеченным:

#include <sstream>
#include <string>
#include <iostream>
#include <ostream>
#include <string.h>

using namespace std;

stringstream ss;

int main()
{
ss << 'a' << 'b' << 'c' << (char) '\0' << '1' << '2' << '3';

string s = ss.str();

cout << s.size() << endl;
cout << s.c_str() << " C string length: " << strlen(s.c_str()) << endl;
cout << s << endl;
}

производит следующий вывод:

7
abc C string length: 3
abc 123
5

Другие решения

Похоже, в вашем файле есть нулевой символ «\ 0». Это считается концом строки.

3

По вопросам рекламы [email protected]