如何在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()
).
考虑使用Boost zip过滤器.据他们说,支持bzip
,gzip
和zlib
格式.
提升zlib
提升gzip
提升bzip2
为了提供比其他用户简要提到的更多详细信息,以下是我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#include #include 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
显然你需要定义gzstreambase析构函数的cpp文件,即gzstream.cpp(这是链接错误).libz只是gzip的c-api,它对c ++ stdlib流一无所知.
Boost的iostream lib也有gzip和bzip2流.
编辑:更新链接以指向包含主要错误修复的代码的最新版本.