2009-03-08 20 views
8

Come faccio a leggere/scrivere file gzippati in C++?Come faccio a leggere/scrivere file compressi con gzip?

I iostream classi wrapper here sembrano buone, e qui è un semplice esempio di utilizzo:

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

ma non ero in grado di collegare in realtà (anche se ho un /usr/lib/libz.a). Un semplice

g++ test-gzstream.cpp -lz 

non lo ha fatto (undefined reference to gz::gzstreambase::~gzstreambase()).

+0

Quindi è necessario utilizzare igzstream e trovare il problema o qualsiasi soluzione è ok? –

+0

LGPL non è un'opzione per me, dal momento che sto sviluppando per iOS, conosci un'alternativa non virale? – rraallvv

risposta

8

Ovviamente è necessario il file cpp in cui è definito anche il distruttore gzstreambase, ovvero gzstream.cpp (che è l'errore del collegamento). libz è solo un c-api per gzip, non sa nulla dei flussi stdlib C++.

La libreria iostream di Boost ha anche flussi gzip e bzip2.

MODIFICA: aggiornato il collegamento per puntare all'ultima versione del codice che include una correzione di errore importante.

+0

usa lib invece di file .cpp. –

+0

Quindi ha bisogno di collegarsi alla lib dove è stato compilato gzstream.cpp. liblm_access? – Macke

+0

Grazie, la semplice compilazione insieme a gzstream.cpp funziona. – Frank

1

Questo è dal "Gzstream Biblioteca Home Page"

O compilare gzstream.C a mano, posto in qualche libreria e spostare gzstream.h nell'inclusione ricerca il percorso del tuo compilatore. In alternativa, utilizzare il Makefile fornito da , adattare le sue variabili e seguire le osservazioni nel file Makefile .

12

Per fornire più dettagli di quelli che sono stati brevemente menzionati dagli altri utenti, ecco come sono riuscito a lavorare con gzstream sul mio computer.

In primo luogo, ho scaricato gzstream e installato nella mia casa (le ultime due righe possono essere aggiunti al vostro ~/.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 

Poi, ho provato l'installazione:

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

Infine , ho scritto un programma fittizio per verificare che ho potuto utilizzare in modo efficace la libreria:

cd ~/temp 
vim test.cpp 

Ecco il codice (molto minimalista, dovrebbe essere molto migliorato per le applicazioni reali!):

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

Ecco come ho compilato:

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

E, ultimo ma non meno importante, ecco come l'ho usato:

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

ho avuto questo problema anche con vecchio compilatore GCC. Ho appena risolto questo problema creando una versione di sola intestazione di gzstream che dovrebbe essere più facile da usare.

https://gist.github.com/1508048

Problemi correlati