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 Réponses :
Voici comment vous lisez un uint32_t à partir d'un fichier: espère que cela aide. p> p>
Cela ne couvre pas les problèmes d'Endian potentiels.
lire les octets comme puis pour transformer plusieurs octets en un entier code> 32 bits code> Par exemple: < / p> ceci devrait couvrir les problèmes de Endian. Peu importe si non signé Char code>:
int code> apparaît comme
b0b1b2b3 code> ou
b3b2b1b0 code> 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. P> p>
Ce pourrait être l'ordre que vous attribuez les octets. Je ne définis pas byte0 code>,
byte1 code>, 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.
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 em> le format écrit et en supposant que la valeur est en effet une valeur non signée de 32 bits: Remarque: cela fonctionnera quel que soit le Le lecteur em> (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 em> l'endansité qu'ils ont été écrites, et (b) les assemblées octet par octet. p> p>
Je jette chaque octet sur Unit32_t code> 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é i> à zéro ci-dessus, avant i> la lecture. Entrez dans cette habitude, BTW. Cela vous servira bien plus tard.
la fonction de bibliothèque de flux C ++ si l'ordre des octets (Endianness) doit être inversé, vous pouvez écrire une simple fonction inverse comme celle-ci: Lecture () Code>
peut être utilisé pour les fichiers d'E / S binaires. Compte tenu de l'exemple de code de la liaison, je commencerais comme ceci: findswap () code>
p> p>
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 code> donné dans le lien!
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 code> 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.