Question

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

Les classes wrapper iostream ici semble bon, 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 pu réellement le lier (bien que j’aie un /usr/lib/libz.a ). Un simple

g++ test-gzstream.cpp -lz

ne l'a pas fait ( référence non définie à gz :: gzstreambase :: ~ gzstreambase () ).

Était-ce utile?

La solution

Évidemment, vous avez besoin du fichier cpp dans lequel le destructeur de gzstreambase est également défini, c'est-à-dire gzstream.cpp (c'est la faute de lien). libz est juste une c-api pour gzip, il ne sait rien des flux c ++ stdlib.

iostream lib de Boost contient également les flux gzip et bzip2.

EDIT: le lien a été mis à jour pour pointer vers la dernière version du code contenant un correctif majeur.

Autres conseils

Pensez à utiliser les filtres zip Boost. Selon eux, il prend en charge les formats bzip , gzip et zlib .

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

J'ai d'abord téléchargé gzstream et je l'ai installé chez moi (vous pouvez ajouter les deux dernières lignes à 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 si je pouvais utiliser efficacement la bibliothèque:

cd ~/temp
vim test.cpp

Voici le code (très minimaliste, il devrait être bien amélioré pour les applications réelles!):

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

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

J'ai également eu ce problème avec l'ancien compilateur GCC. Je viens de corriger cela en créant une version en-tête seulement de gzstream qui devrait être plus facile à utiliser.

https://gist.github.com/1508048

Il s'agit de la " Page d'accueil de la bibliothèque Gzstream "

  

Compilez gzstream.C manuellement,   placez-le dans une bibliothèque et déplacez   gzstream.h dans la recherche d'inclusion   chemin de votre compilateur. Ou utilisez le   Makefile fourni, adaptez ses   variables et suivre les remarques de   le Makefile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top