mauvaise lecture d'un fichier
Bonjour, je désire lire des informations concernant un espèce chimique. Cette espèce est définie par un nom (name), une masse molaire (M), une température critique (T) et 2*7 coefficients. Voici mon fichier donnees.txt
Code:
1 2 3 4 5
|
CH3
12.5 1000.2
12.3 45.2 10.2 45.3 63.22 78 45.1
45.0 56.3 78.98 56.32 478.63 56.32 896.3 |
je veux lire ces données et les afficher à l'écran (pour un début en tout cas). Voici mon prgm
Code:
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
|
#include<stdlib.h>
#include<stdio.h>
int main()
{
int i,j;
double var,M,T;
char name[10];
FILE * file=fopen("donnees.txt","r");
for(i=0;i<1;++i)
{
switch(i)
{
case 0 : fscanf(file,"%s",name);
printf("name = %s\n",name);
break;
case 1 : fscanf(file,"%lf%lf",&M,&T);
printf("%f\t%f\n",M,T);
break;
case 2 : for(j=0;j<7;++j)
{
fscanf(file,"%lf",&var);
printf("%f\t",var);
}
printf("\n");
break;
case 3 : for(j=0;j<7;++j)
{
fscanf(file,"%lf",&var);
printf("%f\t",var);
}
printf("\n");
break;
} // fin du switch
} // fin du for
fclose(file);
return 0;
} |
Mais la sortie est bizarre. J'obtiens :
Code:
1 2 3 4 5
|
name = //CH3
12.500000 1000.200000
12.300000 45.200000 10.200000 45.300000 63.220000 78.000000 45.100000
45.000000 56.300000 78.980000 56.320000 478.630000 56.320000 896.300000 |
Pourquoi ai-je name=//CH3 ? et non pas name=CH3 ??
J'ai esayé avec char * name, mais le compilo me renvoie une erreur de segmentation.
D'où peut provenir cette erreur (ou ce mauvais affichage) ?
Merci.
Re: mauvaise lecture d'un fichier
Citation:
Envoyé par salseropom
Pourquoi ai-je name=//CH3 ? et non pas name=CH3 ??
Avec ton code, on a pas du tout ça...
Correction, sécurisation : (pose des questions si tu ne comprends pas)
Code:
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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
#include <stdlib.h>
#include <stdio.h>
#define fname "../../data/data.txt"
int main ()
{
FILE *file = fopen (fname, "r");
/* -ed- fopen() peut echouer... */
if (file != NULL)
{
int i = 0;
int err = 0;
/* -ed-
Un compteur de lignes sans gestion d'erreur est insuffisant.
*/
while (!err)
{
int n;
switch (i)
{
case 0:
/* -ed-
fscanf (file, "%s", name);
fscanf() est peu recommande.
De plus, il peut echouer.
Ajoute gestion d'erreur.
*/
{
char name[10];
n = fscanf (file, "%9s", name);
if (n != 1)
{
err = 1;
}
else
{
printf ("name = %s\n", name);
}
}
i = 1;
break;
case 1:
{
double M, T;
n = fscanf (file, "%lf%lf", &M, &T);
if (n != 2)
{
err = 1;
}
else
{
printf ("%8.2f%8.2f\n", M, T);
}
}
i = 2;
break;
case 2:
while (!err)
{
double var;
n = fscanf (file, "%lf", &var);
if (n != 1)
{
err = 1;
}
else
{
printf ("%8.2f", var);
}
}
printf ("\n");
i = 3;
break;
case 3:
while (!err)
{
double var;
n = fscanf (file, "%lf", &var);
if (n != 1)
{
err = 1;
}
else
{
printf ("%8.2f", var);
}
}
printf ("\n");
break;
} // fin du switch
} // fin du for
if (err)
{
if (ferror (file))
{
perror (fname);
}
else if (feof (file))
{
printf ("OK\n");
}
else
{
printf ("format error\n");
}
}
fclose (file);
}
else
{
perror (fname);
}
return 0;
} |
qui donne
Code:
1 2 3 4 5 6
|
name = CH3
12.50 1000.20
12.30 45.20 10.20 45.30 63.22 78.00 45.10 45.00 56.30 78.98
56.32 478.63 56.32 896.30
OK |