Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1244 connectés 

  FORUM HardWare.fr
  Programmation
  C

   Transformer un fichier .dat en h5

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Transformer un fichier .dat en h5

n°2192111
candice_38
Posté le 29-05-2013 à 15:49:59  profilanswer
 

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
 

mood
Publicité
Posté le 29-05-2013 à 15:49:59  profilanswer
 

n°2192112
Farian
Posté le 29-05-2013 à 16:01:27  profilanswer
 

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
n°2192118
candice_38
Posté le 29-05-2013 à 16:28:38  profilanswer
 

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

n°2192144
Farian
Posté le 29-05-2013 à 17:20:51  profilanswer
 

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 !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

   Transformer un fichier .dat en h5

 

Sujets relatifs
Archiver tous les fichiers différents d'un fichier précisSortir des infos d'une base MySQL à partir d'un fichier txt ou csv
Passer chemin d'un fichier comme variableproblème d'enregistrement ds fichier TMP j'ai besoin d'aide
Variable DOS = nom_de_fichier[Résolu][Perl] Découper un fichier en plusieurs et optimisation
[résolu] un fichier cpp, 2 compilateurs (g++ et avr-g++)XML/XSLT : Transformer Balises et Attributs
FICHIER TEXTE en JAVA 
Plus de sujets relatifs à : Transformer un fichier .dat en h5


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR