Comment lire un .gz fichier ligne par ligne en C++?
J'ai 3 téraoctet .gz fichier et que vous voulez lire son non compressé contenu ligne par ligne dans un programme C++. Comme le fichier est assez énorme, je veux éviter de le charger complètement en mémoire.
Quelqu'un peut poster un exemple simple de faire cela?
Vous aurez de le décompresser pour être en mesure de le lire. Cependant, ce que vous pouvez faire est de décompresser dans la mémoire, et pas sur le disque. Est-ce que vous vouliez dire ?
Vous ne pouvez pas - il n'y a pas de lignes à lire.
ce 3T? et @Neil est un droit .fichier gz n'aurez pas de "lignes" de son un format binaire.
très probablement, il signifie 3 téraoctets
3 téraoctets, je suppose. Par conséquent, vous ne pouvez pas décompresser le fichier entier.
Vous ne pouvez pas - il n'y a pas de lignes à lire.
ce 3T? et @Neil est un droit .fichier gz n'aurez pas de "lignes" de son un format binaire.
très probablement, il signifie 3 téraoctets
3 téraoctets, je suppose. Par conséquent, vous ne pouvez pas décompresser le fichier entier.
OriginalL'auteur Shihab | 2010-07-08
Vous devez vous connecter pour publier un commentaire.
Vous sera très probablement avoir à utiliser ZLib de se dégonfler, l'exemple est disponible à partir de leurs site
Alternativement, vous pouvez avoir un coup d'oeil à BOOST wrapper C++
L'exemple de BOOST page (décompresse les données d'un fichier et écrit sur la sortie standard)
OriginalL'auteur bobah
Pour quelque chose qui va être utilisé régulièrement, vous voudrez probablement utiliser l'une des suggestions précédentes. Sinon, vous pouvez faire
et ont
yourprogram
lire à partir de la cin. Cela permettra de décompresser les parties du fichier en mémoire que c'est nécessaire, et envoyer la sortie sans compression pouryourprogram
.OriginalL'auteur KeithB
La zlib bibliothèque prend en charge la décompression des fichiers dans la mémoire en blocs, de sorte que vous n'avez pas à décompresser le fichier entier afin de les traiter.
OriginalL'auteur Amnon
À l'aide de zlib, je suis en train de faire quelque chose le long de ces lignes:
EDIT: Enlevé deux mal copié
*
dans l'exemple ci-dessus.EDIT: Corrigé en dehors des limites de lire sur v[pos + lire - 2]
Cela a eu un bug majeur sur la ligne avec v[pos+lire-2] lorsque la ligne a été seulement un caractère '\n' (ligne vide sous linux), vous disposez d'un au-delà de la matrice de lire (-1 est converti à un grand unsigned adresse de mémoire). J'ai ajouté un pré-enregistrement.
OriginalL'auteur mkluwe
Vous ne pouvez pas faire cela, parce que *.gz n'avons pas de "lignes".
Si les données compressées a des retours à la ligne, vous devrez le décompresser. Vous n'avez pas à décompresser toutes les données à la fois, vous le savez, vous pouvez le faire en morceaux, et envoyer des chaînes retour au programme principal lorsque vous rencontrez des caractères de saut de ligne. *.gz peut être décompressé à l'aide de zlib.
OriginalL'auteur SigTerm
Chilkat (http://www.chilkatsoft.com/) a des bibliothèques pour lire des fichiers compressés à partir d'un C++, .Net, VB, ... de l'application.
OriginalL'auteur Patrick
Voici un code avec lequel vous pouvez lire la normale et zippée fichiers ligne par ligne:
OriginalL'auteur Anona112