c qoi le role du caractère "\n" dans fscanf.
'\n' n'a aucun rôle particulier. Du point de vue des conversions par fscanf(), la plupart du temps, il a le même rôle qu'un blanc.
C'est le cas dans une conversion en %s ou %d : la présence d'un '\n' va terminer l'analyse de la ligne pour le %d comme le ferait un blanc. Il reste donc à analyser dans la ligne ce '\n'.
Exemple :
ligne : "abcde 1234 '\n'"
format du fscanf : "%s %d"
résultat du fscanf() : NOM_PERS ="abcde" ; age = 1234 ; reste dans la ligne " '\n'"
il reste donc quelque chose à lire et feof() est faux. On refera un tour de boucle.
Cette fois le fscanf() échouera puisqu'il n'y a plus de chaine, pour le %s, à lire et NOM_PERS et age resteront inchangés
le printf() va afficher une seconde fois la même ligne.
Avec un format "%s%d'\n'" ou "%s%d '\n'" ou "%s%d ", alors le premier fscanf() va lire la chaine "abcde", le nombre 1234 et les caractères <blancs> (au sens de isspace() et '\n' en fait partie), qui suivent. Le fichier est entièrement lu et feof() devient vrai. On ne fait plus une deuxième boucle.
Ici, c'est l'utilisation de feof() qui est discutable. Les fonctions comme fscanf() renvoie des informations permettant de contrôler l'état de la lecture, en l'occurrence le nombre de conversions réussies.
Le code suivant est préférable :
1 2 3 4 5 6
| while (fscanf(P_FICHIER, "%s%d", NOM_PERS,&age)==2)
{
printf("%d NOM : %s age : %d\n",i, NOM_PERS,age);
}
if(feof(P_FICHIER)) printf("Fin de fichier");
else printf("Erreur de format ou de lecture du fichier"); |
Partager