Comment lire ligne par ligne à l’aide de l’interface Boost IOStreams pour les fichiers Gzip?

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. Il semble que le code ci-dessus lise le fichier complet et le stocke dans la mémoire lors de la création de filtering_istreambuf. Est-ce vrai, d’après mon enquête, cela me semble si? Si le fichier est lu en mémoire, ce code peut être un problème pour les gros fichiers (c’est ce que je traite).
  2. Mon code actuel lit le fichier gzippé ligne par ligne à l’aide de l’API gzgets. Existe-t-il un moyen de lire ligne par ligne en utilisant des API boost?

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)