2009-11-17 7 views
2

J'ai un énorme fichier binaire qui est 2148181087 octets (> 2gb)fopen défaut pour le fichier binaire

Je suis en train de faire fopen (file, "r") et il a échoué avec

Impossible d'ouvrir: fichier xyz (Value trop grand pour être stocké dans le type de données)

je lis sur la page man EOVERFLOW erreur est reçu lorsque la taille du fichier> 2gb.

La chose étrange est, j'utilise un fichier d'entrée différent qui est aussi "presque" aussi grand que le premier fichier 2142884400 octets (également> 2 Go), fopen fonctionne très bien avec cela.

Y a-t-il une limite sur la taille de fichier pour fopen ou existe-t-il une autre façon de résoudre ce problème?

+0

Il convient de noter que, pour des raisons de portabilité, vous devez utiliser "rb" pour les fichiers binaires. L'utilisation de "r" pour lire un fichier binaire échouera au moins sur Windows. –

Répondre

6

La coupure est de 2 Go qui, contrairement à ce que vous pensez, est pas 2000000000 (2x1000).

Il s'agit de 2 147 483 648 (2x1024). Donc, votre deuxième fichier, qui fonctionne, est en fait de moins de 2 Go de taille). 2GB, dans le monde de l'informatique, est seulement 2.000.000.000 dans l'esprit des fabricants de disques durs afin qu'ils puissent dire que leurs disques sont plus gros qu'ils ne le sont réellement :-) - cela leur permet de dire que leurs disques sont en réalité 2.1GB.

+0

got it..thanks pour clarifier le calcul de la taille :-) –

+0

Je ne crois pas qu'un fabricant d'ordinateurs serait commercialiser 2G = 2 * 10^9 – jpinto3912

+1

@ jpinto3912: http://en.wikipedia.org/wiki/Gigabyte: "Aujourd'hui, l'utilisation de l'unité gigaoctet est toujours ambiguë: sa valeur peut dépendre du contexte d'utilisation, ce qui signifie généralement 1000^3 octets." – paxdiablo

5

La "méthode alternative pour résoudre ceci" dépend du système d'exploitation/de la bibliothèque que vous utilisez.

Pour la bibliothèque GNU C, you can use fopen64 en remplacement de fopen; il utilise des descripteurs de fichiers 64 bits (il y a aussi une macro pour que les fopen utilisent des handles de fichiers 64 bits).

Pour Windows, vous devrez probablement passer à l'API de gestion de fichiers Win32, avec laquelle vous pouvez utiliser CreateFile.

+0

Je viens de découvrir à partir de la page man à propos de l'appel système fopen64 bit. Je suis actuellement sur la plateforme UNIX. J'ai juste essayé cet appel système et cela a fonctionné. Que voulez-vous dire par des handles de fichiers 64 bits? Est-ce de faire quelque chose avec des limites de 64 bits? Y aura-t-il un effet négatif lors de la lecture du fichier binaire dans l'application si j'utilise fopen64()? –

+0

Le 'FILE *' renvoyé est toujours le même type que retourné par 'fopen', il a juste l'indicateur' O_LARGEFILE'. Le handle de fichier peut être utilisé comme n'importe quel autre handle de fichier avec les fonctions d'E/S typiques. –

+1

Pour les autres qui rencontrent ce problème, je suggère de définir -D_FILE_OFFSET_BITS = 64 sur votre ligne de commande gcc (ou de manière équivalente dans votre makefile). Pour une raison quelconque, utiliser #define dans votre code ne semble pas avoir le même effet. Cette réponse fournit ce que je considère être le meilleur résumé pour vos options ici: http: // stackoverflow.com/A/1035713/3561 – Tyler