4

我有字符串流对象。它通过填充

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 文件。

会是什么?谢谢。

4

2 回答 2

6

您如何确定内容被截断?Astringstream可以包含空字符,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
于 2013-05-16T18:46:41.573 回答
3

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

于 2013-05-16T18:08:09.847 回答