Je regardais la documentation MSDN pour fscanf. J'ai essayé de changer l'exemple de code dans la documentation, mais cela n'a pas fonctionné comme prévu.
Si, par exemple, j'ai un fichier "x" avec le contenu :
"chaîne" 7 3.13 'x'
After scanf("%s", string_input)
est exécuté pour que les données "string"
soient lues dans string_input
, vont-elles à la ligne suivante ou à the 7
pour la lecture suivante?
Ensuite, supposons que les exécutions suivantes :
char test;
fscanf("%c", &test)
Le programme sautera-t-il au 'x'
ou lira-t-il le 7
comme sa valeur ASCII?
Voici ma réécriture de l'exemple de code de la documentation :
#include <stdio.h>
FILE *stream;
int main( void )
{
long l;
float fp,fp1;
char s[81];
char c,t;
stream = fopen( "fscanf.out", "w+" );
if( stream == NULL )
printf( "The file fscanf.out was not opened\n" );
else
{
fprintf( stream, "%s %d %c%f%ld%f%c", "a-string",48,'y', 5.15,
65000, 3.14159, 'x' );
// Security caution!
// Beware loading data from a file without confirming its size,
// as it may lead to a buffer overrun situation.
/* Set pointer to beginning of file: */
fseek( stream, 0L, SEEK_SET );
/* Read data back from file: */
fscanf( stream, "%s", s );
fscanf( stream, "%c", &t );
fscanf( stream, "%c", &c );
fscanf( stream, "%f", &fp );
fscanf( stream, "%f", &fp1 );
fscanf( stream, "%ld", &l );
printf( "%s\n", s );
printf("%c\n", t);
printf( "%ld\n", l );
printf( "%f\n", fp );
printf( "%c\n", c );
printf("f\n",fp1);
getchar();
fclose( stream );
}
}
Voici la sortie :
un string
-858553460
8.000000
4
F
Pourquoi est-ce la sortie ? Je m'attendais à:
un string
0
65000
5.15
Oui
3.14159
Solution du problème
Spécificateur de format manquant :
printf("f\n",fp1);
devrait être:
printf("%f\n",fp1);
Plus important encore: vérifiez la valeur de retour defscanf()
. Il renvoie le nombre d'affectations réussies : il doit s'agir 1
ici de chaque appel, car il doit y avoir exactement une affectation par fscanf()
appel. Si fscanf()
échoue, la variable n'est pas modifiée. Comme les variables dans le code ne sont pas initialisées, en cas fscanf()
d'échec de leur affectation elles contiendront des valeurs aléatoires, ce qui est le cas ici:
/* a-string 48 y 5.15 65000 3.14159 x */
fscanf(stream, "%s", s); /* ^ (s is assigned "a-string") */
fscanf(stream, "%c", &t); /* ^ (t is assigned space) */
fscanf(stream, "%c", &c); /* ^ (c is assigned 4) */
fscanf(stream, "%f", &fp); /* ^ (fp is assigned 8) */
fscanf(stream, "%f", &fp1); /* ^ (fail: 'y' is not a float) */
fscanf(stream, "%ld", &l); /* ^ (fail: 'y' is not a long) */
Aucun commentaire:
Enregistrer un commentaire