如何在C ++中读/写gzip文件?

时间:2009-03-08 20:45:24

标签: c++ gzip zlib gzipstream

如何在C ++中读/写gzip文件?

iostream包装器类here看起来不错,这是一个简单的用法示例:

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

但是我无法实际链接它(虽然我有一个/usr/lib/libz.a)。一个简单的

g++ test-gzstream.cpp -lz

没有这样做(undefined reference to gz::gzstreambase::~gzstreambase())。

5 个答案:

答案 0 :(得分:13)

考虑使用Boost zip过滤器。据他们说,它支持bzipgzipzlib格式。

答案 1 :(得分:13)

为了提供比其他用户简要提及的更多详细信息,以下是我在计算机上设法使用gzstream的方法。

首先,我下载了gzstream并将其安装在我的家中(最后两行可以添加到您的~/.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

然后,我测试了安装:

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

最后,我编写了一个虚拟程序来检查我是否可以有效地使用该库:

cd ~/temp
vim test.cpp

这是代码(极简主义,应该对实际应用程序进行大大改进!):

#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;
}

以下是我如何编译它:

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

最后但并非最不重要的,以下是我如何使用它:

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

答案 2 :(得分:9)

显然你需要定义gzstreambase析构函数的cpp文件,即gzstream.cpp(这就是链接错误)。 libz只是gzip的c-api,它对c ++ stdlib流一无所知。

Boost的iostream lib也有gzip和bzip2流。

编辑:更新了链接以指向包含主要错误修复的最新版本的代码。

答案 3 :(得分:3)

我在使用旧的GCC编译器时遇到了这个问题。我只是通过制作一个gzstream的标题版本来解决这个问题,它应该更容易使用。

https://gist.github.com/1508048

答案 4 :(得分:1)

这是来自“Gzstream图书馆主页”

  

手动编译gzstream.C,   把它放在一些图书馆,然后移动   gzstream.h进入include搜索   编译器的路径。或者使用   提供Makefile,适应它   变量,并按照其中的说法   Makefile。