C ++에서 GZIPPEN 파일을 읽고 쓰는 방법은 무엇입니까?
-
05-07-2019 - |
문제
C ++에서 GZIPPEN 파일을 읽고 쓰는 방법은 무엇입니까?
그만큼 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()
).
해결책
분명히 GZSTREAMBASE Destructor도 정의되는 CPP 파일이 필요합니다. gzstream.cpp (이것이 링크 결함입니다). Libz는 GZIP의 C-API 일 뿐이며 C ++ stdlib 스트림에는 아무것도 모릅니다.
Boost의 ioStream Lib에는 GZIP 및 BZIP2 스트림도 있습니다.
편집 : 주요 버그 수정이 포함 된 최신 버전의 코드를 가리 키도록 링크를 업데이트했습니다.
다른 팁
부스트 지퍼 필터 사용을 고려하십시오. 그들에 따르면, 그것은 지원합니다 bzip
, gzip
그리고 zlib
체재.
다른 사용자가 간단히 언급 한 것보다 자세한 내용을 보려면 다음과 같은 방법은 다음과 같습니다. 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
오래된 GCC 컴파일러와 함께이 문제가있었습니다. 사용하기 쉬운 gzstream의 헤더 전용 버전을 만들어이 문제를 해결했습니다.
이것은 "gzstream library 홈페이지"에서 나온 것입니다.
gzstream.c를 손으로 컴파일하고 일부 라이브러리에 놓고 Gzstream.h를 컴파일러의 검색 경로로 옮깁니다. 또는 제공된 MakeFile을 사용하고 변수를 조정하고 MakeFile의 비고를 따르십시오.