如何在C ++中读取/写入gzipped文件?

16

我该如何在C++中读写gzipped文件?

这里的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())。


1
所以你需要使用igzstream并找到问题,或者任何解决方案都可以吗? - Mykola Golubyev
LGPL对我来说不是一个选择,因为我正在开发iOS应用,你知道有没有非病毒式的替代方案吗? - rraallvv
5个回答

16

15

除了其他用户简单提到的内容外,我将更详细地介绍我如何在我的电脑上使用 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

13

显然,您需要cpp文件,其中定义了gzstreambase析构函数,即gzstream.cpp(这是链接故障)。libz只是gzip的c-api,它不知道c++ stdlib流。

Boost的iostream库也有gzip和bzip2流。

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


他使用库文件而不是.cpp文件。 - Mykola Golubyev
然后他需要链接到编译了gzstream.cpp的库。liblm_access? - Macke
2
gzstream 是LGPL许可的。如果是闭源项目,请注意不要将其用作静态库。 - kiranpradeep

4
我也曾经遇到过这个问题,是因为使用了旧的GCC编译器。我通过创建一个仅包含头文件的版本来解决这个问题,这样会更容易使用。
请参考此链接:https://gist.github.com/1508048

1

这是来自“Gzstream库主页”的内容

要么手动编译gzstream.C,将其放置在某个库中,并将gzstream.h移动到编译器的包含搜索路径中。要么使用提供的Makefile,调整其变量,并遵循Makefile中的说明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接