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()
Répondre
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.
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
- 1. Division de unsigned long long
- 2. Unsigned Long Long - Sortie bizarre
- 3. unsigned long long à double
- 4. Créer Unsigned Long Long de NSString
- 5. Extension de signe avec unsigned long long
- 6. MSVC++ de manutention unsigned long long int
- 7. Pinvoke requête (unsigned long *)
- 8. #define pour unsigned long
- 9. Grappling avec unsigned long multiply
- 10. un long fichier long lecture
- 11. Convertir une chaîne hexadécimale en unsigned long en utilisant strtoul()
- 12. Devons-nous marshall unsigned long?
- 13. VC++ 2010 vs G ++ unsigned long long Différences de débordement
- 14. portable unsigned long en C/C++
- 15. Conversion de CString en unsigned long
- 16. problème dans unsigned longtemps long en C++
- 17. Conversion System :: Uint^en unsigned long
- 18. c passant la valeur à long unsigned long
- 19. problèmes avec unsigned long long et l'impression C++
- 20. Est-ce que 'long unsigned' est aussi valide que 'unsigned long' dans C?
- 21. La différence entre unsigned long et UINT64
- 22. aucune correspondance pour 'opérateur =' dans « * (myCache + ((i) * 32ul)) unsigned long int) (((unsigned long int))
- 23. Problème DLL Delphi/C++ - unsigned long vs unsigned int?
- 24. C: Hex à chaîne Parse unsigned long
- 25. non signé long long VS non signé long long int
- 26. Comment convertir unsigned long de la chaîne
- 27. Quelle est la différence entre unsigned long/long/int en c/C++?
- 28. Utilisation de nombres en dehors de la plage de unsigned long long?
- 29. non signé long long int
- 30. Quel est l'équivalent de unsigned long en java
, vous devriez utiliser fread alors , pas fscanf .. puisque c'est pour lire des chaînes. http://www.cplusplus.com/reference/clibrary/cstdio/fread/ – billjamesdev