Comment puis-je lire ligne par ligne à l'aide de Boost IOStreams' interface pour les fichiers Gzip?
J'ai réussi à intégrer le coup de pouce Iostream Api pour la lecture des fichiers zippés. J'ai suivi la documentation en boost page et les suivantes code de la mesure:
std::stringstream 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 très bien (donc s'il vous plaît ignorer les éventuelles fautes de frappe. et les erreurs ci-dessus :)).
- Ressemble le code ci-dessus va lire le complet, le fichier et le stocker dans la mémoire lors de la création du filtering_istreambuf. C'est vrai que, de mon enquête, il ressemble tellement à moi? Si le fichier est lu en mémoire, ce code peut être un problème pour les fichiers de grande taille (qui est ce que je m'occupe).
- Mon code actuel lit le format à l'aide de gzgets API de la librairie zlib ligne par ligne. Est il possible de le faire ligne par ligne de lecture à l'aide de boost Api?
OriginalL'auteur cppcoder | 2011-06-21
Vous devez vous connecter pour publier un commentaire.
1) Oui, le code ci-dessus
copy()
l'intégralité du fichier dans la mémoire tampon de chaîneoutStr
. Selon le description de la copie2) commutateur de
filtering_istreambuf
àfiltering_istream
et std::getline() de travail:(vous pouvez
std::cout << file.tellg() << '\n';
à l'intérieur de cette boucle, si vous voulez la preuve. Il va augmenter en morceaux importants, mais il ne sera pas égale à la longueur du fichier de départ)OriginalL'auteur Cubbi