Como faço para ler / escrever gzipped arquivos em C ++?
-
05-07-2019 - |
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()
).
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.
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.