1

我正在尝试使用 filtering_streams 将某些对象的序列化压缩到一个array_sink或类似的设备中,然后我可以确定压缩输出的长度并将其复制到另一个流,比如一个文件。但是,使用ostream::tellpon the filtering_ostreamCauses boost 会引发运行时异常。我真的无法弄清楚我做错了什么。

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

问题在于,它tellp是根据与当前写入头位置偏移为 0 的底层流缓冲区来实现的pubseekoff(基本上,这只是糟糕的设计)。现在,这里的踢球者zlib_compressor不适用于接收器output_seekable(如在文档中所见)。这是相当自然的,因为更改写入头几乎肯定会导致数据损坏。如果您尝试解压缩,您会遇到同样的问题。

于 2012-05-10T13:27:28.593 回答