2009-03-08 13 views
8

¿Cómo leo/escribo archivos descomprimidos en C++?¿Cómo leo/escribo archivos descomprimidos?

Las clases contenedoras iostreamhere se ven bien, y aquí es un ejemplo de uso simple:

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

Pero no fue capaz de enlazar en realidad (aunque tengo un /usr/lib/libz.a). Un simple

g++ test-gzstream.cpp -lz 

no lo hizo (undefined reference to gz::gzstreambase::~gzstreambase()).

+0

Así que hay que utilizar igzstream y encontrar el problema o cualquier solución es aceptable? –

+0

LGPL no es una opción para mí, ya que estoy desarrollando para iOS, ¿conoces una alternativa no viral? – rraallvv

Respuesta

8

Obviamente necesita el archivo cpp donde también se define el destructor gzstreambase, es decir, gzstream.cpp (ese es el error del enlace). libz es solo una c-api para gzip, no sabe nada de C++ stdlib streams.

La iostream lib de Boost también tiene transmisiones gzip y bzip2.

EDITAR: se actualizó el enlace para que apunte a la última versión del código que incluye una importante corrección de errores.

+0

usa lib en lugar de archivo .cpp. –

+0

Luego necesita vincular a la lib donde se compiló gzstream.cpp. liblm_access? – Macke

+0

Gracias, solo compilando junto con trabajos de gzstream.cpp. – Frank

1

Esto es de la "Biblioteca Home Page Gzstream"

compilar gzstream.C a mano, lugar de alguna biblioteca, y mueva gzstream.h en el include busque ruta de acceso de su compilador. O use el proporcionado Makefile, adapte sus variables y siga las observaciones en el Makefile.

12

Para dar más detalles de lo que fue brevemente mencionado por los otros usuarios, aquí es cómo me las arreglé para trabajar con gzstream en mi computadora.

En primer lugar, he descargado gzstream y lo instalé en mi casa (las dos últimas líneas se pueden agregar a su ~/.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 

Entonces, he probado la instalación:

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

último , Escribí un programa ficticio para comprobar que podía usar efectivamente la biblioteca:

cd ~/temp 
vim test.cpp 

Aquí está el código (¡muy minimalista, debería mejorarse mucho para aplicaciones reales!):

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

Aquí es cómo lo recopiló:

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

Y por último pero no menos importante, aquí es como lo he usado:

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

tuve este problema, así como con viejo compilador GCC. Acabo de arreglar esto haciendo una única versión del encabezado de gzstream que debería ser más fácil de usar.

https://gist.github.com/1508048

Cuestiones relacionadas