[C] Ecriture/lecture de float dans un fichier

Ecriture/lecture de float dans un fichier [C] - C - Programmation

Marsh Posté le 31-05-2009 à 01:01:28    

Salut,
 
Je rencontre pas mal de soucis pour gérer l'écriture/lecture de virgules flottantes dans un fichier.
Voilà un p'tit exemple de code de test qui pose problème (utilisant ma propre classe file_handler pour gérer le fichier :

Code :
  1. float vara =0.123456;
  2.  float varb =123456.123456;
  3.  float varc =651234.651234;
  4.  file_handler ->initialize("C:/test", FILE_WRITE);
  5.  file_handler ->write_data(vara);
  6.  file_handler ->write_data(varb);
  7.  file_handler ->write_data(varc);
  8.  file_handler ->finalize();
  9.  printf("dataa      : %f\n", vara);
  10.  printf("datab      : %f\n", varb);
  11.  printf("datac      : %f\n", varc);
  12.  float var1;
  13.  float var2;
  14.  float var3;
  15.  file_handler ->initialize("C:/test", FILE_READ);
  16.  file_handler ->read_data(var1);
  17.  file_handler ->read_data(var2);
  18.  file_handler ->read_data(var3);
  19.  file_handler ->finalize();
  20.  printf("data1 read : %f\n", var1);
  21.  printf("data2 read : %f\n", var2);
  22.  printf("data3 read : %f\n", var3);


 
La fonction initialize() fait le fopen.
La fonction finalize() fait le fclose.
 
La fonction read_data(variable) fait :

Code :
  1. {
  2. fread(&data, sizeof data, 1, file);
  3. }


 
La fonction write_data(variable) fait :

Code :
  1. {
  2. fwrite(&data, sizeof data, 1, file);
  3. }


 
Et en sortie, après lecture, j'obtiens ça :

Code :
  1. data1 read : 0.123456
  2. data2 read : 123456.125000
  3. data3 read : 651234.625000


 
Comme vous le voyez, les données ne sont pas identiques.
Pourtant la fonction fwrite/fread font des lectures/écritures bit par bit sur un nombre d'octets définit, dans mon cas il s'agit de 4 octets (sizeof retournant 4 pour le type float).
 
J'ai beau faire 36 000 essaie différent, avec ou sans buffer intermédiare de type char*, même problème...
Est-ce que vous voyez où je me plante ?
 
Je vous remercie d'avance !

Reply

Marsh Posté le 31-05-2009 à 01:01:28   

Reply

Marsh Posté le 31-05-2009 à 01:36:24    

J'ai fait un nouveau test, correspondant plus à ce que je veux faire au final : écrire un tableau de flottant.
J'ai également supprimé ma classe file_handler pour éviter tout problème extérieur :
 

Code :
  1. //Initialisation du tableau à écrire
  2.  float* array =new float[4096];
  3.  for(int i = 0;i < 4096;i++)
  4.    array[i] =(float)random_number->get_value(4096) / random_number->get_value(4096);
  5.  //Ecriture du tableau dans le fichier
  6.  FILE* file =fopen("C:/test.txt", "w" );
  7.      printf("OPEN : %d %d\n", feof(file), ferror(file));
  8.  int octets_ecrits =fwrite(array, sizeof(float), 4096, file);
  9.      printf("Octets écrits : %d\n", octets_ecrits);
  10.      printf("WRITE : %d %d\n", feof(file), ferror(file));
  11.  fclose(file);
  12.      printf("CLOSE : %d %d\n", feof(file), ferror(file));
  13.  //Initialisation du buffer pour la lecture
  14.  float* new_array =new float[4096];
  15.  //Lecture du fichier
  16.    file =fopen("C:/test.txt", "r" );
  17.      printf("OPEN : %d %d\n", feof(file), ferror(file));
  18.  int octets_lus =fread(new_array, sizeof(float), 4096, file);
  19.      printf("Octets lus : %d\n", octets_lus);
  20.      printf("READ : %d %d\n", feof(file), ferror(file));
  21.  fclose(file);
  22.      printf("CLOSE : %d %d\n", feof(file), ferror(file));
  23.  //Comparaison écrits / lus
  24.  for(int i = 0;i < 4096;i++)
  25.   if(new_array[i] != array[i])
  26.   {
  27.    printf("written %f\n", array[i]);
  28.    printf("read    %f\n", new_array[i]);
  29.   }


 
Et voilà ce que j'obtiens : il écrit bien les 4096 octets, mais il ne lit que 11 octets, il attent le EOF juste après !

Code :
  1. OPEN : 0 0
  2. Octets écrits : 4096
  3. WRITE : 0 0
  4. CLOSE : 0 0
  5. OPEN : 0 0
  6. Octets lus : 11
  7. READ : 16 0
  8. CLOSE : 0 0


 
Et ensuite bien entendu aucune valeur n'est identique...


---------------
http://www.ryphon-mechanics.com
Reply

Marsh Posté le 31-05-2009 à 02:21:36    

C'est bon j'ai trouvé d'où venait le problème : le mode d'ouverture du fichier. Il fallait mettre "rb" et "wb". Forcément, le b indique qu'il s'agit de données binaires....lol.


---------------
http://www.ryphon-mechanics.com
Reply

Marsh Posté le 31-05-2009 à 10:12:40    

Tu ferais aussi bien d'utiliser le format texte, c'est plus lisible et portable en représentation.

Reply

Marsh Posté le 05-06-2009 à 23:27:32    

Vel-Ryphon a écrit :

Salut,
 
Je rencontre pas mal de soucis pour gérer l'écriture/lecture de virgules flottantes dans un fichier.
Voilà un p'tit exemple de code de test qui pose problème (utilisant ma propre classe file_handler pour gérer le fichier :


Je recommande le mode texte :  
 
http://www.bien-programmer.fr/notes.htm#enreg_struct


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed