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

时间:2013-05-16 17:56:41

标签: c++ string stringstream boost-iostreams

我有stringstream对象。它通过

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

来自

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

并且实际上保存了ungzipped文件。

现在,如果我使用

将stringstream内容刷新到文件中
std::ofstream ofs(path_to_file,std::ios_base::out|std::ios_base::binary);
ofs << ss.rdbuf();
一切都好。文件中包含完整的正确数据。

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

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

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

内容是多种语言的HTML文件。

它能是什么?感谢。

2 个答案:

答案 0 :(得分:5)

您如何确定内容被截断? 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

答案 1 :(得分:3)

您的文件中似乎有空字符符号'\ 0'。这被认为是字符串的结尾。