15

如何在 C++ 中读取/写入 gzip 压缩文件?

这里iostream包装类看起来不错,下面是一个简单的使用示例:

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

4

5 回答 5

15

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

于 2009-03-08T20:51:35.360 回答
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
于 2011-10-20T20:13:46.117 回答
12

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

Boost 的 iostream 库也有 gzip 和 bzip2 流。

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

于 2009-03-08T20:51:31.537 回答
3

旧的 GCC 编译器也有这个问题。我只是通过制作 gzstream 的仅标头版本来解决此问题,该版本应该更易于使用。

https://gist.github.com/1508048

于 2011-12-21T22:44:54.500 回答
1

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

手动编译 gzstream.C,将其放入某个库中,然后将 gzstream.h 移动到编译器的包含搜索路径中。或者使用提供的 Makefile,修改其变量,并按照 Makefile 中的说明进行操作。

于 2009-03-08T21:01:09.627 回答