4

stringstream オブジェクトがあります。それは満たされています

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

から

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

実際には解凍されたファイルを保持しています。

今、stringstreamのコンテンツをファイルにフラッシュすると

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

コンテンツが切り捨てられていることをどのように判断していますか? 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
于 2013-05-16T18:46:41.573 に答える
3

ファイルにヌル文字記号 '\0' が含まれているようです。それは文字列の終わりと見なされます。

于 2013-05-16T18:08:09.847 に答える