How to gzip-compress on-the-fly in C++ using boost::iostreams
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})