Vendredi 14 Décembre 2001 16:45 - Stéphane :
> Juste une petite questoin, comme cela, avant le WE :
> Je cherche à lire, en C, une ligne du type :
> 1     25.3    24.2    25.6    24.6
> 2     48.6    45.5    45.7    38.5
> ...
lex/yacc, ou plutot flex et bison sous linux.
C'est le meilleur investissement que l'on puisse faire pour etre capable 
d'ecrire des "parsers" rapidement pour le C.

> Le problème est que je fais un scanf (infile," %d %f %f %f %f", &valeur,
> &valeur2, &valeur3, &valeur4, &valeur5);
> Seuelemnt, il me rpend la ligne d'après, si bien que je lis ensuite non
> plus 2, mais 48, puis 0.6 45.5 45.7 24.6 ...
> Evidemment, tout est décalé par la suite.
>
> Comment puis-je faire pour lire une ligne -et un seule- en récupérant
> les champs qui m'intéressent avec leur format spécifique (pour pouvoir
> effectuer des opérations après dessus).
Par exemple avec ce petit programme lex:
--- debut de 'a.lex' ---
%{
#include <stdio.h>
%}
chiffre   [0-9]
entier    {chiffre}+
nombre    {entier}("."{entier})?
%%
[ \n]+ ;
{nombre} {printf ("J'ai trouvé un nombre '%s'\n",yytext);
%%
int yywrap() {return 1;}
int main() {return yylex();}
--- fin de 'a.lex' ---
compilé avec la ligne 'flex a.lex ; gcc lex.yy.c'
tu peux traiter chacun de tes entiers.

ex: 'echo "1 2 3 4 5.67" | ./a.out'
donne: 
J'ai trouvé un nombre '1'
J'ai trouvé un nombre '2'
J'ai trouvé un nombre '3'
J'ai trouvé un nombre '4'
J'ai trouvé un nombre '5.67'

Vois la doc, et passe quelques heures à apprendre. Tu ne pourras plus t'en 
passer, et tu verras à quel point 'scanf' est ringard.

--Laurent

Vous souhaitez acquerir votre Pack ou des Services MandrakeSoft?
Rendez-vous sur "http://www.mandrakestore.com";

Répondre à