Transformer un fichier .dat en h5

Transformer un fichier .dat en h5 - C - Programmation

Marsh Posté le 29-05-2013 à 15:49:59    

Bonjour,
 mon fichier .DAT est de la forme:
 -0.83063E-02 0.19874E-01 0.20252E-01
 -0.83063E-02 0.19874E-01 0.20252E-01
 -0.83063E-02 0.19874E-01 0.20252E-01
 ...... sur 144 lignes.
 
 J'ai écrit cette routine en C pour pouvoir transformer le fichier.DAT en format hdf5.

Code :
  1. #include <string.h>
  2. #include "hdf5.h"
  3. #include "hdf5_hl.h"
  4. #define RANK 2
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. /* #include <conio.h> */
  8. #include <string.h>
  9. #define MAX 100
  10. double *extract(char *TEST)
  11. /* double *extract(char TEST[]) */
  12. {
  13.         char tampon[MAX] = {0};
  14.         int i, n = 0, j, h;
  15.         FILE *fichier = NULL;
  16.         float *tableau;
  17.         printf("Le fichier a ouvrir est : %s\n", "TEST.DAT" );
  18.     fichier = fopen("TEST.DAT", "r" );
  19.     if (fichier != NULL)
  20.     {
  21.         printf("L'ouverture du fichier %s a reussie !\n", "TEST.DAT" );
  22.                 while (fgets(tampon, MAX, fichier) != NULL)
  23.                         n++;
  24.                 printf("Le fichier contient %d valeurs.\n", n);
  25.                 tableau = malloc(n * sizeof(float));
  26.                 if (tableau == NULL)
  27.                 {
  28.                         printf("Erreur allocation !" );
  29.                         exit(0);
  30.                 }
  31.                 else
  32.                 {
  33.                         printf("Allocation reussie !\n" );
  34.                 }
  35.                 rewind(fichier);
  36.                 for (h=0; h<MAX; h++)
  37.                         tableau[h] = 0.0;
  38.                 for (i=0; i<n; i++)
  39.                 {
  40.                         fgets(tampon, MAX, fichier);
  41.                         printf("tampon : %s\n", tampon);
  42.   tableau[i] =    atof(tampon);
  43.   /* Taille de chaque chaine de caractere */
  44.   /*   /\*  printf("%lu", strlen(tampon)); *\/ */
  45.   /* --------- CREATION HDF5 ----------- */
  46. hid_t       file_id;
  47. hsize_t     dims[RANK]={n,1};
  48. herr_t      status;
  49. /* create a HDF5 file */
  50. file_id = H5Fcreate ("ex_lite2.h5",H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
  51. /*  /\* create and write an integer type dataset named "dset" *\/ */
  52. status = H5LTmake_dataset(file_id,"/dset",RANK,dims,H5T_NATIVE_FLOAT,tableau);
  53.        
  54. /* close file */
  55. status = H5Fclose (file_id);
  56.   /* --------- FIN CREATION HDF5 ----------- */
  57.                 }
  58.      
  59. /*                 for (j=0; j<n; j++) */
  60. /*                         printf("%f\n", tableau[j]); */
  61.         }
  62.     else
  63.         printf("L'ouverture du fichier %s a echouee !\n", "TEST.DAT" );
  64.     return 0;
  65. }
  66. int main(void)
  67. {
  68.         int             i;
  69.     char nf[255] = "TEST.DAT";
  70.         double *nbre;
  71.         nbre = extract(nf);
  72. /*         for (i=0; i<MAX; i++) */
  73. /*                 printf("--> %f\n", nbre[i]); */
  74.     return 0;
  75. }


 
Mais quand je lis mon fichier.h5, ça me donne que la première colonne. Je crois que la fonction atof est limitée en nombre de caractere.
 
Comment je peux faire pour retranscrire les 3 colonnes en 3 floats.
 
Merci beaucoup
Candice
 

Reply

Marsh Posté le 29-05-2013 à 15:49:59   

Reply

Marsh Posté le 29-05-2013 à 16:01:27    

Bonjour !
 
Dans votre programme, vous raisonnez en terme de lignes et non pas de valeurs, d'ailleurs, le nombre de valeurs que vous affichez est faux, car c'est le nombre de lignes que vous utilisez.
 
Deux cas se présentent :  
 * Soit le nombre de valeurs par lignes est fixe, et dans ce cas vous pouvez utiliser sscanf au lieu de atof,
 * Dans le cas contraire, vous devez boucler sur le contenu de votre ligne, par exemple en cherchant le caractère qui correspond à votre séparateur (a priori l'espace) et en enchaînant les sscanf jusqu'à ce que vous soyez arrivée au bout de la ligne.
 
Sinon, pour répondre à votre remarque finale, la fonction atof s'arrête au premier caractère qu'elle considère comme invalide, c'est à dire qui correspond à une écriture incorrecte d'un nombre à virgule.
 
Bonne continuation !
 
Edit : Sinon, encore plus simple, après avoir ouvert votre fichier, vous enchaînez les fscanf jusqu'à ce que la fonction vous renvoie 0 ou EOF. Mais vous perdez le formatage par ligne ...


Message édité par Farian le 29-05-2013 à 16:04:09
Reply

Marsh Posté le 29-05-2013 à 16:28:38    

J'ai fait :
 tableau[i] =    sscanf (tampon,  "%*s %f %f %f",&n);
 
Mais il ne se passe rien
Désolée je débute en C.
Pouvez-vous me l'écrire svp
 
Merci

Reply

Marsh Posté le 29-05-2013 à 17:20:51    

En effet, je vois ça :)
 
Si on part du principe que vous avez effectivement 3 valeurs par lignes, les rares modifications à apporter sont  
 * au niveau du "malloc" pour "tableau", allouer 3 fois plus de place,
 * La boucle "for" d'initialisation du tableau ne sert à rien
 * Modification de la boucle "for" de lecture : remplacement du atof par  

Code :
  1. int nbLus;
  2.      nbLus = sscanf(tampon, "%f %f %f", &tableau[3*i], &tableau[3*i+1], &tableau[3*i+2]);


 
Vous rajoutez un test pour vérifier que nbLus vaut bien 3 à chaque étape et ça roule ! Il ne vous reste plus qu'à ajouter vos 3 valeurs dans le fichier H5 et, bien sûr, à désallouer la mémoire pour "tableau".
 
Note : Malgré l'indentation douteuse, il semble que vous écriviez les valeurs dans le fichier à chaque ligne, toujours dans le même fichier !
 
Bonne continuation !

Reply

Sujets relatifs:

Leave a Replay

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