문제

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의 헤더 전용 버전을 만들어이 문제를 해결했습니다.

https://gist.github.com/1508048

이것은 "gzstream library 홈페이지"에서 나온 것입니다.

gzstream.c를 손으로 컴파일하고 일부 라이브러리에 놓고 Gzstream.h를 컴파일러의 검색 경로로 옮깁니다. 또는 제공된 MakeFile을 사용하고 변수를 조정하고 MakeFile의 비고를 따르십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top