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

谁说胖子不能爱 提交于 2019-11-28 23:31:19
Macke

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.

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

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

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

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.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!