This minimal example shows you how to write data to a .gz
file in C++, compressing the data on-the-fly using boost::iostreams
. Using the modern iostreams layer, as opposed to a block-based approach like zlib
allows you to use the full power and ease-of-use of std::ostream
.
#include <fstream> #include <iostream> #include <boost/iostreams/filtering_streambuf.hpp> #include <boost/iostreams/copy.hpp> #include <boost/iostreams/filter/gzip.hpp> using namespace std; int main(int argc, char** argv) { if(argc < 2) { cerr << "Usage: " << argv[0] << " <output .gz file>" << endl; } //Read filename from the first command line argument ofstream file(argv[1], ios_base::out | ios_base::binary); boost::iostreams::filtering_streambuf<boost::iostreams::output> outbuf; outbuf.push(boost::iostreams::gzip_compressor()); outbuf.push(file); //Convert streambuf to ostream ostream out(&outbuf); //Write some test data out << "This is a test text!\n"; //Cleanup boost::iostreams::close(outbuf); // Don't forget this! file.close(); }
cmake_minimum_required(VERSION 3.0) find_package(Boost 1.36.0 COMPONENTS iostreams) include_directories(${Boost_INCLUDE_DIRS}) add_executable(iostreams-gz-compress iostreams-gz-compress.cpp) target_link_libraries(iostreams-gz-compress ${Boost_LIBRARIES})