2014-06-18 1 views
-3

J'essaie d'écrire des entiers 32 bits dans un fichier en utilisant un ostream. J'utilise l'opérateur < <:C++ Dernier numéro est seulement 2 octets au lieu de 4 lors de l'écriture de nombre entier à fstream

ostream file; 
map<unsigned char, int32_t> histogram; 
//… 
file << reinterpret_cast<char*>(&histogram[i]); 

Il fonctionne bien à l'exception du dernier numéro (dans mon cas 11328 qui serait 40 2C 00 00 en binaire) mais seulement 40 2C est écrit dans le fichier.

C'est le même numéro mais quand je vais réimporter le fichier, je veux supposer que chaque numéro est codé en 32 bits.

Qu'est-ce que j'ai fait de mal?

+1

Un peu plus de code, l'entrée d'échantillon, la sortie attendue et la sortie d'échantillon seront utiles pour diagnostiquer le problème. –

+0

Vous avez de la chance que cela a fonctionné du tout. –

+1

Donc, vous voulez écrire un fichier binaire, n'est-ce pas? Ensuite, la conversion en pointeurs est la mauvaise façon de le faire. – stefan

Répondre

4

Vous utilisez la surcharge operator<<(ostream&, const char *) pour quelque chose qui est clairement pas une chaîne se terminant par null style C, qui se traduit par un comportement non défini. Dans le cas 40 2C 00 00, la fonction a interprété l'octet zéro comme un terminateur null, de sorte qu'elle n'a imprimé que les deux premiers octets. Si vous voulez des E/S binaires, utilisez ostream::write(). << est pour formaté E/S.


1) Plus précisément, vous êtes à terre un comportement non défini chaque fois que le dernier octet de l'entier est non nul - à savoir, chaque fois que cela imprime tous les 4 octets que vous souhaitez imprimer.

+0

Avec 'ostream :: write()', il devra formater lui-même les données. Il y a une raison pour laquelle il faut un 'char const *', et pas un 'void const *'; Si vous avez besoin d'un 'reinterpret_cast', vous faites quelque chose de non portable. –

0

Lorsque vous utilisez file << reinterpret_cast<char*>(&histogram[i]);, en fait, il pense que vous souhaitez générer une chaîne de style C. Donc, il va arrêter la sortie en rencontrant un '\ 0'. Donc, votre résultat est 40 2C.

Vous pouvez essayer la fonction fwrite() dans stdio.h.

+0

'fwrite()' n'est pas une bonne recommandation pour C++. –

+1

@ πάνταῥεῖ 'fwrite()' n'est même pas une bonne recommandation pour C. –

+0

Je suis désolé.J'ai recommandé fwrite() parce que je ne suis pas familier avec la classe ostream.Mais je veux savoir pourquoi fwrite() isn ' t une bonne recommandation pour C? Merci. @ JamesKanze – tianzhi0549

Questions connexes