1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| #include<stdio.h>
#include<string.h>
int main (void)
{
/* -ed-
char buffer[5000];
char *chaine;
float p1, p2;
il est preferable de definir les variables pres de l'endroit ou on
les utilise. Ca simplifie la lecture et la maintenance.
*/
/* -ed-
il vaut mieux eviter de melanger test et affectation surtout dans les if().
Ca alourdi la lecture inutilement...
FILE *fp;
if ((fp = fopen ("text.txt", "r")) == NULL)
*/
FILE *fp = fopen ("text.txt", "r");
if (fp == NULL)
printf ("Erreur de fichier\n");
else
{
/* -ed- deplace . C'est pas un peu beaucoup 5000 ? */
char buffer[256];
/* -ed-
while (!feof (fp))
{ // pas certain de cette ligne !
fgets (buffer, 5000, fp);
feof() ne fait pas ce que tu crois. On doit tester la valeur retournee
par la fonctino de lecture. Par exemple, en cas d'arret de la lecture,
fgets() retourne NULL. Si on veut connaitre la cause exacte de l'arret
de la lecture, on peut utiliser feof() et ferror() apres couo, mais
c'est rarement utile...
Il est utilie ici de combiner la lecture de la ligne avec le test de la
valeur retournee. En effet, c'esrt en testant la valeur
*/
while (fgets (buffer, sizeof buffer, fp) != NULL)
{
/* -ed-
if (chaine = strstr (buffer, "COM : "))
== !NULL
ceci n'est pas tres clair... Je propose
*/
char *chaine = strstr (buffer, "COM : ");
if (chaine != NULL)
{
/* -ed- deplace. Le choix de float est dscutable. double est plus precis... */
float p1, p2;
/* -ed-
sscanf (chaine, "COM : %f %f", &p1, &p2);
il faut tester a partir de la suite de la chaine recherchee.
d'autre part, sscanf() peut echouer. Il faut tester la valeur
retournee (ici, 2, car on attend 2 conversions).
*/
int n = sscanf (chaine + strlen ("COM : "), "%f %f", &p1, &p2);
if (n == 2)
{
/* -ed- Pour un float ou un double, c'est "%f" et non "%s"
printf ("P1 = %f\n P2 = %s\n", p1, p2);
*/
printf ("P1 = %f\n P2 = %f\n", p1, p2);
}
}
}
/* -ed-
fclose (fp);
afin de faciliter la mise au point des gros programmes, il est
recommande de forcer un pointeur invalide a NULL.
*/
fclose (fp), fp = NULL;
}
/* -ed-
return (0);
return est une instruction, pas une fonction.
Les parentheses snt inutiles
*/
return 0;
} |