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