Эта библиотека оболочки 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 неполон в том, что он не поддерживает Z_SYNC_FLUSH. Это означает, что он не подходит для потоковых приложений, таких как интерактивные протоколы TCP. Я люблю boost и использую ее как основную библиотеку поддержки C ++ во всех моих проектах C ++, но в данном конкретном случае ее нельзя было использовать в моем приложении из-за отсутствующей функции сброса.