C ++でgzip圧縮されたファイルを読み書きするにはどうすればよいですか?
-
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のヘッダーのみのバージョンを作成して、これを修正しました。
これは、「Gzstreamライブラリホームページ」からのものです。
手動でgzstream.Cをコンパイルし、 それをいくつかの図書館に置き、移動する インクルード検索へのgzstream.h コンパイラのパス。または Makefileを提供し、その適応 変数、および Makefile。