GOOGLE ADS

lundi 2 mai 2022

comment fscanf fonctionne-t-il avec différents types de variables ?

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 7pour 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 7comme 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 1ici 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

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique&nbsp;?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...