Mon fichier binaire ressemble à ceci.
00000000: 0000 0803 0000 ea60 0000 001c 0000 001c
00000010: 0000 0000 0000 0000 0000 0000 0000 0000
la colonne de gauche est l'adresse.
J'ai juste essayé de lire 0000 0803
(= 2051) comme suit
ifstream if;
if.open("file");
uint32_t a;
if >> a;
Comme prévu ... Cela n'a pas fonctionné :-(a
était juste 0 après l'exécution.
J'ai essayé long, int, unsigned int, unsigned long
. Tout a échoué.
Pourquoi ceux-ci ne fonctionnent pas et comment puis-je atteindre l'objectif?
Vous avez deux problèmes:
Assurez-vous de lire les octets que vous souhaitez (ni moins, ni plus) dans le flux.
Je recommanderais cette syntaxe:
uint32_t a;
inFILE.read(reinterpret_cast<char *>(&a), sizeof(a));
Assurez-vous d'interpréter ces octets avec l'ordre d'octets correct.
Q: Si vous êtes sur un PC, votre CPU est probablement petit endian . Savez-vous si votre flux de données est également petit-boutien, ou est-il gros-boutiste?
Si les données sont big-endian, je considérerais les fonctions de mise en réseau standard pour s'adapter à l'ordre des octets: ntohl()
, etc: http://www.retran.com/beej/htonsman.html
AUSSI:
Suivez les conseils d'Hcorg et de Daniel Jour: n'oubliez pas le paramètre "open mode", et n'oubliez pas de vérifier les erreurs "file open".
Ouvrez le fichier en mode binaire puis utilisez la méthode read()
, quelque chose comme:
uint32_t a;
ifstream file ("file", ios::in | ios::binary);
if (file.is_open())
{
file.read ((char*)&a, sizeof(a));
}