boost::iostreams で圧縮・復元(gzip)
C++ でデータの圧縮・復元をする場合,boost C++ library に便利な Filter があります.gzip -c や gzip -cd などで対応できないときには,検討する価値があると思います.
# リンクするときにライブラリ libboost_iostream... を指定する必要があります.また,zlib_compressor や bzip2_compressor も提供されています.
#include <iostream> #include <boost/iostreams/filtering_streambuf.hpp> #include <boost/iostreams/filter/gzip.hpp> // 受け取ったデータを圧縮して出力ストリームに渡す. class Compressor { public: Compressor(std::ostream *output) : filter_(), stream_(&filter_) { filter_.push(boost::iostreams::gzip_compressor()); filter_.push(*output); } std::ostream &stream() { return stream_; } private: boost::iostreams::filtering_streambuf<boost::iostreams::output> filter_; std::ostream stream_; // Disallows copies. Compressor(const Compressor &); Compressor &operator=(const Compressor &); }; // 入力ストリームから受け取った圧縮データを解凍する. class Decompressor { public: Decompressor(std::istream *input) : filter_(), stream_(&filter_) { filter_.push(boost::iostreams::gzip_decompressor()); filter_.push(*input); } std::istream &stream() { return stream_; } private: boost::iostreams::filtering_streambuf<boost::iostreams::input> filter_; std::istream stream_; // Disallows copies. Decompressor(const Decompressor &); Decompressor &operator=(const Decompressor &); };