Recherche et lecture de fichiers volumineux dans une application Linux C ++
Je suis en cours d'exécution dans le dépassement des nombres entiers à l'aide de la norme ftell et fseek d'options à l'intérieur de G++, mais je suppose que je me trompais, car il semble que ftell64 et fseek64 ne sont pas disponibles. J'ai été la recherche et de nombreux sites web semblent référence à l'aide de lseek avec le off64_t type de données, mais je n'ai pas trouvé d'exemples de référencement de quelque chose d'égal à fseek. Maintenant les fichiers que je lis en sont 16GO+ CSV fichiers avec l'attente d'au moins le double de celui.
Sans les librairies externes, ce qui est la méthode la plus simple pour réaliser une structure similaire comme la fseek/ftell paire? Mon application fonctionne maintenant en utilisant le standard de GCC/G++ bibliothèques pour les 4.x.
source d'informationauteur John Bellone
Vous devez vous connecter pour publier un commentaire.
fseek64 est une fonction C. Pour la rendre disponible, vous devrez définir _FILE_OFFSET_BITS=64 avant, y compris le système d'en-têtes Qui va plus ou moins définir fseek pour être réellement fseek64. Ou de le faire dans les arguments de compilateur par exemple
gcc-D_FILE_OFFSET_BITS=64 ....
http://www.suse.de/~aj/linux_lfs.html a une grande overviw de fichiers de taille importante sur linux:
Si vous voulez coller à la norme ISO C interfaces standard, utilisez
fgetpos()
etfsetpos()
. Toutefois, ces fonctions ne sont utiles que pour la sauvegarde d'une position dans le fichier et revenir à la même position. Ils représentent la position en utilisant le typefpos_t
qui n'est pas nécessaire d'être un type de données entier. Par exemple, sur un enregistrement de base de système, il pourrait être une structure contenant un numéro d'enregistrement et le décalage dans l'enregistrement. C'est peut-être trop restrictif.POSIX définit les fonctions
ftello()
etfseeko()
qui représentent la position à l'aide de laoff_t
type. Ce doit être de type entier, et la valeur est une valeur de décalage d'octet à partir du début du fichier. Vous pouvez effectuer l'arithmétique sur elle, et peut utiliserfseeko()
à effectuer par rapport cherche. Cela fonctionne sur Linux et d'autres systèmes POSIX.En outre, de compiler avec
-D_FILE_OFFSET_BITS=64
(Solaris/Linux). Cela permettra de définiroff_t
être une version 64 bits de type (c'est à direoff64_t
) au lieu delong
et redéfinir les fonctions qui utilisent des décalages de fichier pour être les versions 64 bits des décalages. C'est la valeur par défaut lorsque vous compilez pour 64 bits, n'est donc pas nécessaire dans ce cas.fseek64()
n'est pas standard, le compilateur docs devrait vous dire où le trouver.Avez-vous essayé
fgetpos
etfsetpos
? Ils sont conçus pour les gros fichiers et la mise en œuvre utilise généralement un 64-bits type de comme la base pour la fpos_t.Avez-vous essayé fseeko() avec le _FILE_OFFSET_BITS symbole de préprocesseur ensemble de 64?
Cela vous donnera une fseek()-comme l'interface, mais avec un paramètre de décalage de type off_t au lieu de long. Réglage _FILE_OFFSET_BITS=64 fera off_t un 64-bits type.
La même pour va pour ftello().
Utilisation
fsetpos(3)
etfgetpos(3)
. Ils utilisent lefpos_t
type de données , qui, je crois, est la garantie d'être en mesure de tenir au moins 64 bits.