IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

role \n dans fscanf


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2003
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 128
    Par défaut role \n dans fscanf
    bonjour,
    c qoi le role du caractère "\n" dans fscanf.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (!feof(P_FICHIER))
         { 
          fscanf(P_FICHIER, "%s %d\n", NOM_PERS,&age);
          printf("NOM : %s age : %d\n", NOM_PERS,age);
     
    }
    si je n'utilise pas \n dans fscanf, le programme m'affiche la dernière ligne dans le fichier 'toto.txt' deux fois

    Merci

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    J'imagine qu'il y a un caractère d'espacement (espace, tabulation ou retour à la ligne) à la fin de ton fichier. Sans le "\n" fscanf croit lire après ta dernière valeur, une dernière ligne (qui pour un humain ressemble fort à une chaine vide, la machine est bien sûr d'un tout autre avis, un caractère d'espacement restant un caractère). En fait fscanf lit la ligne jusqu'au prochain caractère d'interligne, et charge les différents champs (chaîne de caractères sans caractère d'espacement) selon les spécifications du format.

    Dans ton cas, fscanf ne lit qu'une fois la dernière ligne mais l'écrit deux fois puisque les valeurs n'ont pas été modifiées par le dernier fscanf qui à lu une chaine composée uniquement de caractères d'espacement. Si tu veux vérifier tu peux supprimer tout caractère après la dernière valeur et voir que ta dernière ligne n'apparaitra qu'une fois, tu peux aussi allouer de la mémoire pour tes variables dans la boucle (ou juste les initialiser, mais c'est un peu moins spectaculaire) et constater que la dernière ligne écrite ne correspond plus à rien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      while (!feof(P_FICHIER))
       { 
       NOM_PERS = (char*) malloc(32); 
       age = (int) malloc(sizeof(int)); 
       fscanf(P_FICHIER, "%s %d", NOM_PERS,&age);
       printf("NOM : %s age : %d\n", NOM_PERS,age);
       }
    (à ne pas faire hein, c'est juste pour la démo)

    Il est souvent conseillé d'utilisé fgets (quitte à interpréter les résultats avec sscanf par la suite) qui est plus "blindée". Il existe de nombreux comparatifs entre ces fonctions sur le web...

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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");

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/02/2014, 13h03
  2. Réponses: 4
    Dernier message: 18/05/2010, 09h43
  3. role de "%" dans un prog.
    Par john491 dans le forum Général Python
    Réponses: 5
    Dernier message: 02/05/2006, 21h12
  4. [ Struts ] récupération des roles dans l'ActionForm
    Par rikunter dans le forum Struts 1
    Réponses: 3
    Dernier message: 21/04/2006, 10h07
  5. Utilisation de template dans un role de fonctions/procedures
    Par Punky65250 dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 01/09/2004, 10h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo