1

私はfiltering_streamsを使用して、オブジェクトのシリアル化をarray_sinkまたは同様のデバイスに圧縮しようとしています。そこで、圧縮された出力の長さを決定し、それを別のストリーム、たとえばファイルにコピーできます。ただし、原因でを使用ostream::tellpすると、filtering_ostreamブーストが実行時例外をスローします。私は自分が間違っていることを本当に理解することはできません。

using namespace boost::iostreams;

char *buffer = new char[4096*255];
array_sink zipStream(buffer, 4096*255);

filtering_ostream tempOut;
tempOut.push(zlib_compressor());
tempOut.push(zipStream);

column->Serialize(tempOut); // Object::Serialize(ostream&)
tempOut.flush(); // ?
int zipSize = tempOut.tellp();

// Do stuff with zipStream...
4

1 に答える 1

2

問題は、現在の書き込みヘッドの位置から0オフセットされtellpた、基になるストリームバッファーの観点から実装されていることです(基本的には、設計が不十分です)。pubseekoffさて、ここでのキッカーは、シンクでzlib_compressorは機能しないというoutput_seekableことです(ドキュメントで見ることができます)。書き込みヘッドを変更すると、ほぼ確実にデータが破損するため、これはかなり自然なことです。解凍しようとすると、まったく同じ問題が発生します。

于 2012-05-10T13:27:28.593 に答える