这个 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 模式下),因此它可以在交互式网络协议中使用。最后只需调用完成以获取最后一位压缩数据和一个终止块。虽然 boost 示例更短,但它需要使用其他两个不像 std::string 那样知名的模板类,即 filtering_streambuf 和不太标准的 boost::iostreams:copy。zlib 的 boost 接口不完整,因为它不支持 Z_SYNC_FLUSH。这意味着它不适用于 TCP 交互协议等在线流应用。