2012-08-27 5 views
1

Comment lire un entier non signé de 64 bits à partir d'un fichier? Je l'ai stocké en tant que données binaires réelles, pas une représentation de chaîne.Lecture long unsigned long en utilisant fscanf()

+4

, vous devriez utiliser fread alors , pas fscanf .. puisque c'est pour lire des chaînes. http://www.cplusplus.com/reference/clibrary/cstdio/fread/ – billjamesdev

Répondre

3

Comment est-il codé? Les nombres binaires diffèrent généralement par endianness. Si vous voulez supposer que c'est la même chose que l'endianness de l'hôte actuel, vous pouvez directement utiliser fread. Sinon, vous devrez l'échanger en octets après la lecture.

Pour les points bonus, en supposant que vous ayez le contrôle sur la façon dont il est sérialisé, vous pouvez indiquer l'endianness avec un marqueur ou un ordre d'octet.

3

Quelque chose comme ceci:

FILE * fp = fopen("file.bin", "rb"); 

uint64_t value; 
if (fread(&value, sizeof value, fp) != sizeof value) { /* error */ } 

// ... 

fclose(fp); 

Si c'est vous qui avez écrit les données, cela devrait fonctionner hors de la boîte. Si les données proviennent d'un autre endroit, vérifiez la documentation du format binaire pour tenir compte des différences de représentation entre le format sérialisé et votre plate-forme (par exemple, un échange d'octets peut être nécessaire).


Une alternative, plus pédagogique mais moins efficace consiste à lire les données dans un tampon et à appliquer votre propre traitement. Ceci est plus flexible (par exemple, vous pouvez traiter comme endiannesses fou 3-2-1-4-7-8-6-5), mais probablement beaucoup plus lent:

unsigned char buf[sizeof uint64_t]; 
if (fread(buf, sizeof buf, fp) != sizeof buf) { /* error */ } 
uint64_t leval = buf[0] + (buf[1] << 8) + /* ... */; 
uint64_t beval = buf[7] + (buf[6] << 8) + /* ... */; 
uint64_t ceval = (buf[0] << 16) + (buf[1] << 8) + buf[2] + (buf[3] << 24) + /* ... */; 
bien
Questions connexes