J’ai réussi à intégrer les API boost Iostream pour la lecture de fichiers compressés. J’ai suivi la documentation dans la page de démarrage et j’ai le code suivant jusqu’à présent:
std::ssortingngstream outStr; ifstream file("file.gz", ios_base::in | ios_base::binary); try { boost::iostreams::filtering_istreambuf in; in.push(boost::iostreams::gzip_decompressor()); in.push(file); boost::iostreams::copy(in, outStr); } catch(const boost::iostreams::gzip_error& exception) { int error = exception.error(); if (error == boost::iostreams::gzip::zlib_error) { //check for all error code } }
Le code fonctionne bien (donc ignorez les fautes de frappe et les erreurs ci-dessus :)).
1) Oui, le code ci-dessus copy()
le fichier entier dans la chaîne tampon outStr
. Selon la description de copie
La copie de modèle de fonction lit les données d’un modèle donné de Source et les écrit dans un modèle de Sink donné jusqu’à la fin du stream.
2) passer de filtering_istreambuf
à filtering_istream
et std :: getline () fonctionnera:
#include #include #include #include int main() { std::ifstream file("file.gz", std::ios_base::in | std::ios_base::binary); try { boost::iostreams::filtering_istream in; in.push(boost::iostreams::gzip_decompressor()); in.push(file); for(std::ssortingng str; std::getline(in, str); ) { std::cout << "Processed line " << str << '\n'; } } catch(const boost::iostreams::gzip_error& e) { std::cout << e.what() << '\n'; } }
(vous pouvez std::cout << file.tellg() << '\n';
intérieur de cette boucle si vous voulez une preuve. Cela augmentera considérablement, mais la longueur du fichier ne sera pas égale à celle du fichier. début)