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 <iostream>
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 <iostream>
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:)