[英]How do I read / write gzipped files in C++?
如何在 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()
)。
为了提供比其他用户简要提到的更多的细节,这里是我如何设法在我的计算机上使用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
显然,您还需要定义 gzstreambase 析构函数的 cpp 文件,即gzstream.cpp (这是链接错误)。 libz 只是 gzip 的 c-api,它对 c++ stdlib 流一无所知。
Boost 的 iostream 库也有 gzip 和 bzip2 流。
编辑:更新了链接以指向包含主要错误修复的代码的最新版本。
旧的 GCC 编译器也遇到了这个问题。 我只是通过制作一个 header 的唯一版本的 gzstream 来解决这个问题,它应该更易于使用。
这是来自“Gzstream图书馆主页”
手动编译 gzstream.C ,将其放在某个库中,然后将 gzstream.h 移动到编译器的包含搜索路径中。 或者使用提供的Makefile,修改其变量,按照Makefile中的说明进行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.