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

47,020

Solution 1

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.

Solution 2

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

Solution 3

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

Solution 4

I had this trouble as well with old GCC compiler. I just fixed this by making a header only version of gzstream which should be easier to use.

https://gist.github.com/1508048

Solution 5

This is from the "Gzstream Library Home Page"

Either compile gzstream.C by hand, place it in some library, and move gzstream.h into the include search path of your compiler. Or use the provided Makefile, adapt its variables, and follow the remarks in the Makefile.

Share:
47,020
Frank
Author by

Frank

Updated on April 04, 2020

Comments

  • Frank
    Frank about 4 years

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

    The iostream wrapper classes here look good, and here is a simple usage example:

    gz::igzstream in(filename);
    std::string line;
    while(std::getline(in, line)){
      std::cout << line << std::endl;
    }
    

    But I wasn't able to actually link it (although I have a /usr/lib/libz.a). A simple

    g++ test-gzstream.cpp -lz
    

    didn't do it (undefined reference to gz::gzstreambase::~gzstreambase()).