У меня есть объект 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 на нескольких языках.
Что это может быть? Благодарю.
Как вы определяете, что контент урезан? 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
Похоже, в вашем файле есть нулевой символ «\ 0». Это считается концом строки.