How do I read / write gzipped files?

2019-01-23 07:30发布

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()).

5条回答
Explosion°爆炸
2楼-- · 2019-01-23 07:39

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

查看更多
啃猪蹄的小仙女
3楼-- · 2019-01-23 07:43

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
查看更多
来,给爷笑一个
4楼-- · 2019-01-23 07:48

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.

查看更多
放我归山
5楼-- · 2019-01-23 07:49

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

查看更多
孤傲高冷的网名
6楼-- · 2019-01-23 07:55

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.

查看更多
登录 后发表回答