提升filtering_stream和tellp

时间:2012-05-10 11:36:28

标签: c++ boost boost-iostreams

我正在尝试使用filtering_streams将某个对象的序列化压缩为array_sink或类似的设备,然后我可以确定压缩输出的长度并将其复制到另一个流,比如文件。但是,在ostream::tellp上使用filtering_ostream会导致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...

1 个答案:

答案 0 :(得分:1)

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