lire une suite de nombre séparé par une tabulation dans un fichier

lire une suite de nombre séparé par une tabulation dans un fichier - C - Programmation

Marsh Posté le 29-11-2009 à 11:53:36    

Salut,
Je rencontre un probleme pour lire une suite de nombre séparé par une tabulation dans un fichier.
Mon but est de rentrer chacun des ses nombre dans mon tableau line[].
J'ouvre donc mon fichier puis boucle sur la ligne que j'ai lu, mais je n'ai pas ce que je veux dans mon fichier.
Voici le morceau de code, cf commentaires :
 

Code :
  1. char *s, *d;
  2. int i;
  3. float line[1000];
  4. fgets(s, maxlen, file); // recupere ma ligne en question
  5. // contenu de s : 12(tabulation)5(tabulation)7
  6. // le mot tabulation n'est pas écrit, il n'y a dans cette ligne que des chiffres et des \t
  7. // j'ai essyé :
  8. for(i=0; i<strlen(s); i++)
  9.     sscanf(s, "%f\t", &line[i]);
  10. // contenu de line : les 7 premières cases (de 0 à 6) = 12. Ensuite vide.
  11. // je voudrais : line[0]=12, line[1]=5,line[2]=7
  12. }


 
En C pur.
Msrci pour votre aide.  :)

Reply

Marsh Posté le 29-11-2009 à 11:53:36   

Reply

Marsh Posté le 30-11-2009 à 08:26:22    

utilise strtok

Reply

Marsh Posté le 30-11-2009 à 11:12:36    

Merci, ca ne marche pas très bien.. où je ne sais pas m'en servir. J'ai repris l'exemple de la doc :  
 

Code :
  1. void tokenize(char * line){
  2.   float * pch;
  3.   int i;
  4.   float tab[1000];
  5.   pch = strtok(line,"\t" );  // je decoupe ma ligne avec les \t
  6.   i=0;
  7.   while (pch != NULL){
  8.        fprintf(stdout,"%f\n",pch);  // ici ca m'affiche toujours 0.000
  9.        sprintf(&tab[i],"%f",pch);    // je veux stocker chaque élément dans mon tableau, mais idem 0.000
  10.        i++;
  11.        pch = strtok (NULL, "\t" );
  12.    }
  13. }


Je l'utilise mal ? Je ne sais pas.
Merci de votre aide !

Reply

Marsh Posté le 30-11-2009 à 11:26:58    

C'est quoi le type de retour de strtok, c'est quoi le type attendu pour le premier parameter de sprintf, c'est quoi le type de pch, c'est quoi le type de tab?
 


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 30-11-2009 à 11:58:23    

line => char * (récupéré par fgets() )
strtok d'apres la doc retourne un pointeur vers le premier element trouvé,
pch => un pointeur de type float, c'est pourquoi j'ai mis %f dans mon sprintf/fprintf. Ca serait ca l'erreur ? Je ne dois pas mettre %f ? Mais que mettre à la place ?!

Reply

Marsh Posté le 30-11-2009 à 12:36:59    

tabb a écrit :


strtok d'apres la doc retourne un pointeur vers le premier element trouvé,


 
oui donc un char* :o

Reply

Marsh Posté le 30-11-2009 à 15:53:33    

strtok ? Pourquoi pas tout simplement :
 

Code :
  1. int i;
  2. float line[1000];
  3. // contenu de s : 12(tabulation)5(tabulation)7
  4. // le mot tabulation n'est pas écrit, il n'y a dans cette ligne que des chiffres et des \t
  5. for (i=0; i < 1000 && fscanf(file, "%f", line + i) == 1; i++);


Reply

Marsh Posté le 30-11-2009 à 16:52:34    

tabb a écrit :

line => char * (récupéré par fgets() )
strtok d'apres la doc retourne un pointeur vers le premier element trouvé,

On fait man strtok, et on a immédiatement la réponse;
char *strtok(char *str, const char *delim);
Si pour vous, char* et float*, c'est la même chose, vaut peut être mieux recommencer les cours de programmation à 0.
A+,


Message édité par gilou le 30-11-2009 à 16:54:38

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 01-12-2009 à 01:34:19    

Pourquoi ne pas lire caractère par caractère et sauter les espaces?
Une tabulation n'est rien qu'un ensemble d'espaces.
 

Reply

Marsh Posté le 01-12-2009 à 08:31:02    

non,une tabulation c'ets \t

Reply

Marsh Posté le 01-12-2009 à 08:31:02   

Reply

Marsh Posté le 01-12-2009 à 09:42:17    

char * fonctionne très bien avec un atof() ensuite.
Je ne sais pas pourquoi j'ai mis un float *  à vrai dire :??:  
Merci bien.

Reply

Sujets relatifs:

Leave a Replay

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