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