Je dois halluciner

Signaler
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
-
Messages postés
59
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
1 septembre 2006
-
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

Messages postés
224
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
18 octobre 2010

En effet il FAUT mettre "rb" lorsqu'on lit du binaire sinon c'est du texte.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Ben ta lu le post ? Je le dis deux fois explicitement, mais c'est pas ma question
Messages postés
59
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
1 septembre 2006

ç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 ...