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"