6
votes

Lecture d'octets en C ++

J'essaie de lire des octets du fichier binaire mais sans succès. J'ai essayé de nombreuses solutions, mais je ne reçois pas de résultat. STRUCTURE DE FICHIER:

auto myfile = fopen("t10k-images.idx3-ubyte", "r");
char buf[30];
auto x = fread(buf, 1, sizeof(int), myfile);


4 commentaires

La partie où elle a dit "MSB en premier" était un peu important.


Que signifie "aucun succès"? Je crois que cela devrait lire la taille de (int) octets dans le tampon. Vous devriez vérifier x après la lecture pour vous assurer qu'il est égal à X == Tailleof (int). Essayez d'imprimer le tampon comme hexagonal pour voir si elle l'avait lu correctement.


Je suppose que la question est une endanianesse. Si le int S sur disque est grand Endian et que le système est petit Endian, les chiffres ne correspondent pas.


Ironiquement, je suis arrivé ici après avoir omis de lire la base de données du chiffre manuscrit mnist, tout comme vous.


4 Réponses :


1
votes

Voici comment vous lisez un uint32_t à partir d'un fichier: xxx

espère que cela aide.


1 commentaires

Cela ne couvre pas les problèmes d'Endian potentiels.



3
votes

lire les octets comme non signé Char : xxx

puis pour transformer plusieurs octets en un entier 32 bits Par exemple: < / p> xxx

ceci devrait couvrir les problèmes de Endian. Peu importe si int apparaît comme b0b1b2b3 ou b3b2b1b0 sur le système, car la conversion est traitée par des changements de bits. Le code n'assume aucun ordre particulier en mémoire.


2 commentaires

Ce pourrait être l'ordre que vous attribuez les octets. Je ne définis pas byte0 , byte1 , etc. ici pour vous. C'est quelque chose que vous devez faire.


Oui, j'ai remplacé les octets dans l'ordre et ça marche. Désolé, je ne peux pas marquer les deux réponses comme correctes.



1
votes

Connaître l'endansion de votre disposition de votre fichier d'où la lecture de numériques multi-octets est importante. En supposant que Big-Endian est toujours le format écrit et en supposant que la valeur est en effet une valeur non signée de 32 bits: xxx

Remarque: cela fonctionnera quel que soit le Le lecteur (votre programme) est un peu d'Endian ou de Big-Endian. Je suis sûr que j'ai manqué au moins un casting là-bas, mais j'espère que vous obtenez le point. Le seul coffre-fort, et mode de lecture de numérics multi-octets est à (a) savoir l'endansité qu'ils ont été écrites, et (b) les assemblées octet par octet.


5 commentaires

Je jette chaque octet sur Unit32_t avant de changer chaque octet dans ma réponse. Pas sûr si le compilateur les promeut automatiquement pour chaque quart de travail.


Tu n'es pas le seul. Les gars de la langue sauraient plus que moi, mais je fais habituellement comme vous l'avez fait (chaque valeur promue avant le quart de travail). Donne beaucoup de dactylographie, mais fonctionne. J'ai vu les deux. Voir Cet exemple pour une conversion associée. (et j'ai eu la chance de voter votre réponse, si je suis d'accord avec cela).


@WhozCraig Votre méthode fonctionne! Mais comme indiqué ci-dessus, "Magic" est 0. Maintenant, je reçois "2051", ce qui est le résultat dont j'ai besoin.


@wsevendays alors si Geoff's devrait


@wsevendays magic est initialisé à zéro ci-dessus, avant la lecture. Entrez dans cette habitude, BTW. Cela vous servira bien plus tard.



2
votes

la fonction de bibliothèque de flux C ++ Lecture () peut être utilisé pour les fichiers d'E / S binaires. Compte tenu de l'exemple de code de la liaison, je commencerais comme ceci: xxx

si l'ordre des octets (Endianness) doit être inversé, vous pouvez écrire une simple fonction inverse comme celle-ci: findswap ()


2 commentaires

Je reçois quelque chose comme 50855936, 270991360, 469762048, 469762048. Donc, cette méthode ne fonctionne pas.


@wsevendays: C'est le même problème que possible de la réponse de Geoff_montee, vous avez également 50855936 (d'autres ordres d'octets). Essayez la fonction endwewap donné dans le lien!