How do I read / write gzipped files in C++?

Consider using the Boost zip filters. According to them, it supports bzip, gzip and zlib format.

  • boost zlib
  • boost gzip
  • boost bzip2

Obviously you need the cpp-file where the gzstreambase destructor is defined as well, i.e. gzstream.cpp (that's the link fault). libz is just a c-api for gzip, it knows nothing of c++ stdlib streams.

Boost's iostream lib has gzip and bzip2 streams too.

EDIT: Updated the link to point to the latest version of the code that includes a major bug fix.


To give more details than what was briefly mentioned by the other users, here is how I managed to work with gzstream on my computer.

First, I downloaded gzstream and installed it in my home (the two last lines can be added to your ~/.bash_profile):

cd ~/src
mkdir GZSTREAM
cd GZSTREAM/
wget http://www.cs.unc.edu/Research/compgeom/gzstream/gzstream.tgz
tar xzvf gzstream.tgz
cd gzstream
make
export CPLUS_INCLUDE_PATH=$HOME/src/GZSTREAM/gzstream
export LIBRARY_PATH=$HOME/src/GZSTREAM/gzstream

Then, I tested the installation:

make test
...
# *** O.K. Test finished successfully. ***

Finally, I wrote a dummy program to check that I could effectively use the library:

cd ~/temp
vim test.cpp

Here is the code (very minimalist, should be much improved for real applications!):

#include <iostream>
#include <string>
#include <gzstream.h>
using namespace std;

int main (int argc, char ** argv)
{
  cout << "START" << endl;

  igzstream in(argv[1]);
  string line;
  while (getline(in, line))
  {
    cout << line << endl;
  }

  cout << "END" << endl;
}

Here is how I compiled it:

gcc -Wall test.cpp -lstdc++ -lgzstream -lz

And last but not least, here is how I used it:

ls ~/ | gzip > input.gz
./a.out input.gz
START
bin/
src/
temp/
work/
END