Wie lese ich / Schreib-gzip-Dateien in C ++?
-
05-07-2019 - |
Frage
Wie können wir lesen / schreiben gzip-Dateien in C ++?
Die iostream
Wrapper-Klassen hier gut aussehen, und hier ist ein einfaches Anwendungsbeispiel:
gz::igzstream in(filename);
std::string line;
while(std::getline(in, line)){
std::cout << line << std::endl;
}
Aber ich war nicht in der Lage, um es tatsächlich zu verknüpfen (obwohl ich ein /usr/lib/libz.a
haben). Ein einfaches
g++ test-gzstream.cpp -lz
tat es nicht (undefined reference to gz::gzstreambase::~gzstreambase()
).
Lösung
Selbstverständlich können Sie die CPP-Datei benötigen, wo der gzstreambase destructor auch definiert, dh
Andere Tipps
Beachten Sie die Boost-Zip-Filter verwenden. Nach ihnen, es unterstützt bzip
, gzip
und zlib
Format.
Um mehr Details als das, was von den anderen Nutzern kurz erwähnt wurde, ist hier, wie ich mit gzstream
auf meinem Computer arbeiten, verwaltet werden.
Als erstes habe ich heruntergeladen gzstream
und installiert es in meinem Haus (die beiden letzten Zeilen können zu Ihrem ~/.bash_profile
hinzugefügt werden):
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
Dann habe ich getestet, um die Installation:
make test
...
# *** O.K. Test finished successfully. ***
Schließlich schrieb ich ein Dummy-Programm zu überprüfen, dass ich effektiv die Bibliothek verwenden:
cd ~/temp
vim test.cpp
Hier ist der Code (sehr minimalistisch, sollte viel für reale Anwendungen verbessert werden!):
#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;
}
Hier ist, wie ich es kompiliert:
gcc -Wall test.cpp -lstdc++ -lgzstream -lz
Und last but not least, hier ist, wie ich es benutzt:
ls ~/ | gzip > input.gz
./a.out input.gz
START
bin/
src/
temp/
work/
END
Ich hatte dieses Problem auch mit altem GCC Compiler. Ich reparierte gerade dies durch eine Header-Version von gzstream machen, die leichter sein sollte, zu verwenden.
Dies ist von der "Gzstream Bibliothek Home Page"
So oder kompilieren gzstream.C von Hand, legen Sie sie in irgendeiner Bibliothek und Umzug gzstream.h in die Suche einbeziehen Pfad Ihres Compilers. Oder verwenden Sie die vorgesehen Makefile, passen ihre Variablen, und folgen Sie den Ausführungen in das Makefile.