Question

Je rencontre un dépassement d'entier en utilisant les options standard ftell et fseek dans G ++, mais je suppose que je me suis trompé car il semble que ftell64 et fseek64 ne sont pas disponibles. J'ai effectué des recherches et de nombreux sites Web semblent citer l'utilisation de lseek avec le type de données off64_t , mais je n'ai trouvé aucun exemple faisant référence à un élément égal à fseek . . Pour le moment, les fichiers que je lis sont des fichiers de 16 Go + CSV avec au moins le double.

Sans bibliothèques externes, quelle est la méthode la plus simple pour obtenir une structure similaire à celle de la paire fseek / ftell ? Mon application fonctionne maintenant avec les bibliothèques standard GCC / G ++ pour 4.x.

Était-ce utile?

La solution

fseek64 est une fonction C. Pour le rendre disponible, vous devez définir _FILE_OFFSET_BITS = 64 avant d'inclure les en-têtes système définissant plus ou moins fseek comme étant réellement fseek64. Ou faites-le dans les arguments du compilateur, par exemple.  gcc -D_FILE_OFFSET_BITS = 64 ....

http://www.suse.de/~aj/linux_lfs.html supporte beaucoup de fichiers volumineux sous Linux:

  • Compilez vos programmes avec "gcc -D_FILE_OFFSET_BITS = 64". Cela oblige tous les appels d'accès aux fichiers à utiliser les variantes 64 bits. Plusieurs types changent également, par exemple off_t devient off64_t. Il est donc important de toujours utiliser les types corrects et de ne pas utiliser, par exemple. int au lieu de off_t. Pour la portabilité avec d'autres plates-formes, vous devez utiliser getconf LFS_CFLAGS, qui renverra -D_FILE_OFFSET_BITS = 64 sur les plates-formes Linux, mais pourrait renvoyer autre chose, par exemple. Solaris. Pour la liaison, vous devez utiliser les indicateurs de lien signalés via getconf LFS_LDFLAGS. Sur les systèmes Linux, vous n’avez pas besoin d’indicateurs de lien spéciaux.
  • Définissez _LARGEFILE_SOURCE et _LARGEFILE64_SOURCE. Avec ces définitions, vous pouvez utiliser les fonctions de LFS comme open64 directement.
  • Utilisez l'indicateur O_LARGEFILE avec open pour opérer sur des fichiers volumineux.

Autres conseils

Si vous souhaitez vous en tenir aux interfaces standard ISO C, utilisez fgetpos () et fsetpos () . Cependant, ces fonctions ne sont utiles que pour enregistrer une position de fichier et revenir à la même position ultérieurement. Ils représentent la position en utilisant le type fpos_t , qui n'est pas obligatoirement un type de données entier. Par exemple, sur un système basé sur un enregistrement, il peut s'agir d'une structure contenant un numéro d'enregistrement et un décalage dans l'enregistrement. Cela peut être trop limitatif.

POSIX définit les fonctions ftello () et fseeko () , qui représente la position en utilisant le type off_t . Cela doit être un type entier et la valeur est un octet décalé depuis le début du fichier. Vous pouvez effectuer une opération arithmétique dessus et utiliser fseeko () pour effectuer des recherches relatives. Cela fonctionnera sous Linux et d’autres systèmes POSIX.

De plus, compilez avec -D_FILE_OFFSET_BITS = 64 (Linux / Solaris). Ceci définira off_t comme étant un type 64 bits (c'est-à-dire off64_t ) au lieu de long , et redéfinira les fonctions qui utilisent les décalages de fichier pour être les versions qui prennent des décalages 64 bits. Ceci est la valeur par défaut lorsque vous compilez pour 64 bits, donc ce n’est pas nécessaire dans ce cas.

fseek64 () n'est pas standard, la documentation du compilateur devrait vous dire où le trouver.

Avez-vous essayé fgetpos et fsetpos ? Ils sont conçus pour les gros fichiers et l’implémentation utilise généralement un type 64 bits comme base pour fpos_t.

Avez-vous essayé fseeko () avec le symbole _FILE_OFFSET_BITS du préprocesseur défini sur 64 ?

Cela vous donnera une interface de type fseek () , mais avec un paramètre offset de type off_t au lieu de long . Si vous définissez _FILE_OFFSET_BITS = 64 , off_t sera un type 64 bits.

Idem pour ftello () .

Utilisez fsetpos (3) et fgetpos (3) . Ils utilisent le type de données fpos_t , qui, à mon avis, est capable de contenir au moins 64 bits.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top