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 à