web-dev-qa-db-fra.com

Lire un entier 32 bits à partir d'un fichier binaire en C ++?

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?

14
plhn

Vous avez deux problèmes:

  1. 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));

  2. 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".

27
paulsm4

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));
}
4
VolAnd