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ジップフィルターの使用を検討してください。彼らによると、それは、、およびフォーマットをサポートbzipgzipますzlib

于 2009-03-08T20:51:35.360 に答える
13

他のユーザーが簡単に言及したことよりも詳細を説明するためにgzstream、私が自分のコンピューターでどのように作業したかを以下に示します。

まず、ダウンロードgzstreamして自宅にインストールしました (最後の 2 行を に追加できます~/.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のiostreamlibには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 に答える