使用"zlib sync flush"时获取boost::iostreams::zlib_compressor
是否需要一些魔力?只是在过滤器上调用flush
,或在包含它的strict_sync
上filtering_ostream
看不到这项工作(即我希望压缩器足够冲洗,以便解压缩程序可以恢复所有到目前为止,压缩器消耗的字节数,而不关闭流。)
查看header,似乎定义了一些“刷新代码”(特别是sync_flush
),但我不清楚它们应该如何使用(请记住我的压缩器只是添加了进入filtering_ostream
)。
答案 0 :(得分:2)
事实证明symmetric_filter
存在一个基本问题
zlib_compressor
继承自身不可冲洗(这似乎相当
疏忽)。
可能会向symmetric_filter
添加这样的支持就像添加flushable_tag
并公开现有的私有刷新方法一样简单,但是现在我可以忍受它。
答案 1 :(得分:0)
这个C ++ zlib包装器库,我是作者,支持刷新功能,可以说更简单:
https://github.com/rudi-cilibrasi/zlibcomplete
这很容易:
#include <iostream>
#include <zlc/zlibcomplete.hpp>
using namespace zlibcomplete;
using namespace std;
int main(int argc, char **argv)
{
const int CHUNK = 16384;
char inbuf[CHUNK];
int readBytes;
ZLibCompressor compressor(9, auto_flush);
for (;;) {
cin.read(inbuf, CHUNK);
readBytes = cin.gcount();
if (readBytes == 0) {
break;
}
string input(inbuf, readBytes);
cout << compressor.compress(input);
}
cout << compressor.finish();
return 0;
}
与boost的主要区别在于,您只需传入一个字符串并写出压缩字符串,而不是使用模板类过滤器,而该字符串可以根据需要多次输出。每个字符串都将被刷新(在auto_flush模式下),因此可以在交互式网络协议中使用。最后,只需调用finish即可获得最后一位压缩数据和终止块。虽然boost示例较短,但它需要使用另外两个不像std :: string那样的模板类,即filtering_streambuf和较低标准的boost :: iostreams:copy。 zlib的boost接口不完整,因为它不支持Z_SYNC_FLUSH。这意味着它不适用于在线流媒体应用程序,例如TCP交互式协议。我喜欢使用boost并将其用作我所有C ++项目中的主要C ++支持库,但在这种特殊情况下,由于缺少刷新功能,它在我的应用程序中无法使用。