Je dois halluciner

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 19 avril 2005 à 20:02
MNEMONIC Messages postés 59 Date d'inscription dimanche 19 décembre 2004 Statut Membre Dernière intervention 1 septembre 2006 - 22 avril 2005 à 09:02
J'ai bricoler quelque programme pour écriture lecture de fichier binaire. Si quelqu'un peut m'expliquer ce qui se passe.



Voila un programme tout simple qui écrit test et test2 dans un fichier
binaire puis j'ouvre le fichier que je viens de créer et je vérifie que
les deux valeurs sont bien enregistrées. Jusque la tout va bien.



#include <fstream>

#include

using namespace std;

int main()

{

ifstream fichier_in;

ofstream fichier_out;



float test = 1.619f;

float test2 = 1.619f;



fichier_out.open("adata", ios::out | ios::binary | ios::trunc);

fichier_out.write((char*)(&test), 4);

fichier_out.write((char*)(&test2), 4);

fichier_out.close();



system("PAUSE");

float value1;

float value2;



fichier_in.open("adata", ios::in | ios::binary);

fichier_in.read((char*)(&value1), 4);

fichier_in.read((char*)(&value2), 4);

cout << value1 << " " << value2 << endl;



fichier_in.close();

system("PAUSE");

return(0);

}



Voici la sortie:

Appuyez sur une touche pour continuer...

1.619 1.619

Appuyez sur une touche pour continuer...



Le problème vient ensuite, j'ai fais un autre programme avec stdio.h qui lit de la meme facon:



#include <stdio.h>

#include



using namespace std;

int main()

{

FILE *file = fopen("adata" , "r"); // il semble que "rb" ne soit pas nécessaire.



float val[2];

fseek(file, 0, SEEK_SET);

fread(&val, 4, 2, file);

cout << val[0] << endl;

cout << val[1] << endl;

fclose(file);

system("PAUSE");

}



Voici la sortie:

1.619

1.619


Appuyez sur une touche pour continuer...



Donc tout va bien, si vous pouvez essayer maintenant avec


float test = 1.618f;


float test2 = 1.618f;



puis réexécuter le premier programme puis le second, voila ce que j'obtiens:

2.24208e-043

3.21412e-039


Appuyez sur une touche pour continuer...



Bien sur si on précise que l'on lit en binaire dans le deuxième programme

FILE *file = fopen("adata" , "rb");

Tout rentre dans l'ordre, mais pourquoi ce bug pour ce nombre ? Alors
que j'ai pas pu trouver un autre nombre pour lequel ca buggait de la
meme facon.



Si quelqu'un a deux minutes pour tester chez lui, et me faire part des résultats, je suis curieux:)

3 réponses

bayeto Messages postés 224 Date d'inscription mardi 12 août 2003 Statut Membre Dernière intervention 18 octobre 2010
19 avril 2005 à 22:51
En effet il FAUT mettre "rb" lorsqu'on lit du binaire sinon c'est du texte.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
19 avril 2005 à 23:10
Ben ta lu le post ? Je le dis deux fois explicitement, mais c'est pas ma question
0
MNEMONIC Messages postés 59 Date d'inscription dimanche 19 décembre 2004 Statut Membre Dernière intervention 1 septembre 2006
22 avril 2005 à 09:02
ça donne la même chose pour les deux programmes ?

Essaye de faire fread((char *)&val, 4, 2, file);
dans le deuxième pour voir ...
0
Rejoignez-nous