C++: Zeilen in einer GZ-Datei mit boost::iostreams iterieren
English
Deutsch
Problem:
Du hast eine gzip-komprimierte Datei, die du mit C++ dekomprimieren möchtest. Du möchtest keine Pipes zu gzip in einem externen Prozess verwenden. Du möchtest auch nicht zlib und manuelles Puffern verwenden.
Lösung
Dies ist eine Erweiterung des offiziellen gzip_decompressor-Beispiels. Es ist auch auf bzip2-Dateien anwendbar, vorausgesetzt man verwendet den korrekten Dekomprimierungsfilter.
Das Programm nimmt ein einzelnes Kommandozeilenargument (eine gzip-komprimierte Datei) und gibt die dekomprimierte Ausgabe auf stdout aus.
myzcat.cpp
/**
* myzcat.cpp
* Ein zcat-Ersatz zu Bildungszwecken.
* Verwendet boost::iostream und zlib.
*
* Kompilieren wie folgt:
* clang++ -o myzcat myzcat.cpp -lz -lboost_iostreams
*
* Dieser Code ist als Public Domain veröffentlicht.
*/
#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/gzip.hpp>
int main(int argc, char** argv) {
if(argc < 2) {
std::cerr << "Verwendung: " << argv[0] << " <gzip-Eingabedatei>" << std::endl;
}
//Vom ersten Kommandozeilenargument lesen, annehmen dass es gzip-komprimiert ist
std::ifstream file(argv[1], std::ios_base::in | std::ios_base::binary);
boost::iostreams::filtering_streambuf<boost::iostreams::input> inbuf;
inbuf.push(boost::iostreams::gzip_decompressor());
inbuf.push(file);
//streambuf in istream umwandeln
std::istream instream(&inbuf);
//Zeilen iterieren
std::string line;
while(std::getline(instream, line)) {
std::cout << line << std::endl;
}
//Aufräumen
file.close();
}Check out similar posts by category:
C/C++
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow