Pergunta

Como faço para ler gravação compactado arquivos / em C ++?

O iostream invólucro aulas aqui boa aparência, e aqui está um exemplo de uso simples:

gz::igzstream in(filename);
std::string line;
while(std::getline(in, line)){
  std::cout << line << std::endl;
}

Mas eu não era capaz de realmente vinculá-lo (embora eu tenha um /usr/lib/libz.a). Um simples

g++ test-gzstream.cpp -lz

não fez isso (undefined reference to gz::gzstreambase::~gzstreambase()).

Foi útil?

Solução

Obviamente você precisa do arquivo cpp onde o destruidor gzstreambase é definida como bem, isto é, gzstream.cpp (que é a falha link). libz é apenas um c-api para gzip, ele não sabe nada do C ++ fluxos stdlib.

lib iostream Boost tem gzip e bzip2 córregos também.

EDIT: Atualizado o link para apontar para a versão mais recente do código que inclui uma importante correção de bug.

Outras dicas

Considere o uso Boost zip filtros. De acordo com eles, ele suporta bzip, gzip e formato zlib.

Para dar mais detalhes do que o que foi brevemente mencionado por outros usuários, aqui é como eu consegui o trabalho com gzstream no meu computador.

Em primeiro lugar, eu baixei gzstream e instalado em minha casa (as duas últimas linhas podem ser adicionadas ao seu ~/.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

Então, eu testei a instalação:

make test
...
# *** O.K. Test finished successfully. ***

Finalmente, eu escrevi um programa fictício para verificar se eu poderia efetivamente usar a biblioteca:

cd ~/temp
vim test.cpp

Aqui está o código (muito minimalista, deve ser muito melhorado para aplicações reais!):

#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;
}

Aqui está como eu compilado:

gcc -Wall test.cpp -lstdc++ -lgzstream -lz

E por último mas não menos importante, aqui é como eu usei-o:

ls ~/ | gzip > input.gz
./a.out input.gz
START
bin/
src/
temp/
work/
END

Eu tive este problema, bem com o compilador GCC idade. Eu apenas fixo isso através de um cabeçalho única versão do gzstream que deve ser mais fácil de usar.

https://gist.github.com/1508048

Esta é a partir do "Gzstream Biblioteca Home Page"

De qualquer gzstream.C compilação com a mão, colocá-lo em alguma biblioteca, e movimento gzstream.h no incluem pesquisa caminho do compilador. Ou usar o fornecido Makefile, adaptar a sua variáveis, e siga as observações em o Makefile.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top