2012-05-10 3 views
0

私はfiltered_streamsを使用して、array_sinkなどのデバイスへのシリアル化を圧縮しようとしています。そこで、圧縮された出力の長さを決定し、別のストリーム、たとえばファイルにコピーできます。ただし、filtering_ostreamostream::tellpを使用すると、ブーストによってランタイム例外がスローされます。私が間違っていることを本当に理解することはできません。Boost filtering_streamとtellp

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... 

答えて

1

問題はtellpが基本となるストリームバッファ現在の書き込みヘッドの位置からのオフセット0とpubseekoffの面で実装されていることである(基本的には、それだけが悪いデザインです)。ここでは、zlib_compressoroutput_seekableシンクでは動作しません(ドキュメントに見られるように)。これは、書き込みヘッドを変更すると、ほぼ確実にデータが破損するため、かなり自然です。解凍しようとすると、まったく同じ問題が発生します。

+0

ありがとうございます!私はこの考え方に沿って作業していましたが、シークできないとtellpを防ぐことはできませんでしたが、スタックを実行すると、実際にそれを探していて、例外がスローされていました。ストリームに 'counter'フィルタを置いて、私が望むことを達成しました。 – MischaNix