C ++でgzip圧縮されたファイルを読み書きするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/624250

  •  05-07-2019
  •  | 
  •  

質問

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

やらなかった( gz :: gzstreambase ::〜gzstreambase()への未定義の参照)。

役に立ちましたか?

解決

明らかに、gzstreambaseデストラクタも定義されているcppファイルが必要です。つまり、 gzstream.cpp (これはリンク障害です)。 libzはgzipの単なるc-apiであり、c ++ stdlibストリームを認識しません。

Boostのiostreamライブラリにはgzipおよびbzip2ストリームもあります。

EDIT:主要なバグ修正を含む最新バージョンのコードを指すようにリンクを更新しました。

他のヒント

Boost zipフィルターの使用を検討してください。彼らによると、 bzip gzip 、および zlib 形式をサポートしています。

他のユーザーが簡単に述べたものよりも詳細を提供するために、コンピューターで 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

古いGCCコンパイラでもこの問題が発生しました。使いやすいはずのgzstreamのヘッダーのみのバージョンを作成して、これを修正しました。

https://gist.github.com/1508048

これは、「Gzstreamライブラリホームページ」からのものです。

  

手動でgzstream.Cをコンパイルし、   それをいくつかの図書館に置き、移動する   インクルード検索へのgzstream.h   コンパイラのパス。または   Makefileを提供し、その適応   変数、および   Makefile。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top