16 votes

Comment lire / écrire des fichiers gzippés en C++ ?

Comment puis-je lire / écrire des fichiers compressés au format gzip en C++?

Les classes enveloppes iostream ici semblent bonnes, et voici un exemple d'utilisation simple:

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

Mais je n'ai pas réussi à le lier réellement (bien que j'aie un /usr/lib/libz.a). Un simple

g++ test-gzstream.cpp -lz

n'a pas fonctionné (undefined reference to gz::gzstreambase::~gzstreambase()).

16voto

Considérez l'utilisation des filtres Boost zip. Selon eux, cela prend en charge les formats bzip, gzip et zlib.

15voto

tflutre Points 636

Pour fournir plus de détails que ce qui a été brièvement mentionné par les autres utilisateurs, voici comment j'ai réussi à travailler avec gzstream sur mon ordinateur.

Tout d'abord, j'ai téléchargé gzstream et l'ai installé dans mon dossier personnel (les deux dernières lignes peuvent être ajoutées à votre ~/.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

Ensuite, j'ai testé l'installation:

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

Enfin, j'ai écrit un programme factice pour vérifier que je pouvais utiliser efficacement la bibliothèque:

cd ~/temp
vim test.cpp

Voici le code (très minimaliste, devrait être grandement amélioré pour de vraies applications!):

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

Voici comment je l'ai compilé:

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

Et enfin, voici comment je l'ai utilisé:

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

13voto

Macke Points 13474

Bien sûr, vous avez besoin du fichier cpp où le destructeur gzstreambase est défini également, c'est-à-dire gzstream.cpp (c'est le lien incorrect). libz n'est qu'une API c pour gzip, il ne sait rien des flux stdlib c++.

La bibliothèque iostream de Boost a également des flux gzip et bzip2.

EDIT : J'ai mis à jour le lien pour pointer vers la dernière version du code qui inclut une correction majeure de bug.

4voto

J'ai également eu ce problème avec un ancien compilateur GCC. Je l'ai simplement résolu en créant une version uniquement en-tête de gzstream qui devrait être plus facile à utiliser.

https://gist.github.com/1508048

1voto

Mykola Golubyev Points 21210

Ceci provient de la page d'accueil de la "Bibliothèque Gzstream"

Soit compiler gzstream.C manuellement, le placer dans une bibliothèque, et déplacer gzstream.h dans le chemin de recherche des inclusions de votre compilateur. Soit utiliser le Makefile fourni, adapter ses variables, et suivre les remarques dans le Makefile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X