为什么stringstream :: str()截断字符串?

Ale*_*der 1 c++ string stringstream boost-iostreams

我有stringstream对象.它是通过填补

stringstream ss;
boost::iostreams::copy(inp,ss);
Run Code Online (Sandbox Code Playgroud)

boost::iostreams::filtering_streambuf<boost::iostreams::input> inp;
Run Code Online (Sandbox Code Playgroud)

并实际上保持在其中的ungzipped文件.

现在,如果我将stringstream内容刷新到文件

std::ofstream ofs(path_to_file,std::ios_base::out|std::ios_base::binary);
ofs << ss.rdbuf();
Run Code Online (Sandbox Code Playgroud)

一切都好.文件中包含完整的正确数据.

但是,如果我而不是像这样刷新文件构造字符串

std::string s = ss.str();
Run Code Online (Sandbox Code Playgroud)

内容在中间某处被截断.它不是持久性错误,它显然取决于字符串缓冲区的内容.

内容是几种语言的HTML文件.

它能是什么?谢谢.

Mic*_*urr 5

你是如何确定内容被截断的?A 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;
}
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

7
abc C string length: 3
abc 123
Run Code Online (Sandbox Code Playgroud)