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 :

scanf vs fgets


Sujet :

C

  1. #81
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Oui, ça, tout le monde est d'accord. Ce que dit Nicolas, c'est le scanf() suivant le printf() va forcer l'affichage. C'est possible, et dans ce cas précis, je suis d'accord que le fflush(stdout) est superflu.

    Mais dans le cas général, nul ne peut affirmer qu'un printf() avec une chaine non terminée par un '\n' sera suivi d'un scanf(). La regle générale est donc de mettre un fflush(stdout) si la chaine n'est pas terminée par un \n.
    Donc on est d'accord, à l'occasion si tu trouve la réponse dans la norme dis le nous.
    Cordialement.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  2. #82
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Le flux standard de sortie est automatiquement vidé sur une lecture sur stdin donc le scanf vide stdout de toutes les manières alors à quoi bon?
    C'est le cas en C++, mais à ma connaissance, c'est pas garanti en C. Je vais voir ce que dit la norme à ce sujet.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #83
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne suis pas sûr que ce soit tellement le cas en C++, car c'est justement le genre de problème qui m'avait dissuadé d'utiliser les flux standard C++ (je ne connaissais pas l'équivalent C++ de fflush() à l'époque).

    D'un autre côté, c'était sous Visual 6, donc...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #84
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je ne suis pas sûr que ce soit tellement le cas en C++, car c'est justement le genre de problème qui m'avait dissuadé d'utiliser les flux standard C++ (je ne connaissais pas l'équivalent C++ de fflush() à l'époque).

    D'un autre côté, c'était sous Visual 6, donc...
    A ma connaissance:

    <HS>
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <iostream>
     
    /* ... */
     
    int nombre;
    std::cout << "Entrez un nombre entre 1 et 10: " /* << std::flush n'est pas necessaire ici */
    while (!(std::cin >> nombre) || nombre < 1 || nombre > 10)
    {
       /* Mon code en cas d'erreur */
    }
    </HS>

    Dans ce code, l'invite est garantie de s'afficher à cause de la lecture sur le flux std::cin (il faut que je retrouve la référence). Pour un affichage équivalent en C, il faut appeler fflush(stdout):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("Entrez un nombre entre 1 et 10: ");
    fflush(stdout);
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #85
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Comment interpreteriez-vous cet extrait de la norme?

    When a stream is line buffered, characters are intended to be transmitted to or from the host environment as a block when a new-line character is encountered. Furthermore, characters are intended to be transmitted as a block to the host environment when a buffer is filled, when input is requested on an unbuffered stream, or when input is requested on a line buffered stream that requires the transmission of characters from the host environment. Support for these characteristics is implementation-defined, and may be affected via the setbuf and setvbuf functions.
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #86
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En effet, c'est bizarre et difficile à comprendre.

    Mais je trouve encore plus étrange qu'une lecture sur un stream provoque le flush d'un autre stream...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #87
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je ne suis pas sûr que ce soit tellement le cas en C++, car c'est justement le genre de problème qui m'avait dissuadé d'utiliser les flux standard C++ (je ne connaissais pas l'équivalent C++ de fflush() à l'époque).

    D'un autre côté, c'était sous Visual 6, donc...
    [Warning: C++ detected] Cette fonctionnalité est implantée dans basic_istream. L'objet std::cin (qui permet de lire sur le flux d'entrée associé à stdin) est lié à l'object std::cout (qui permet d'écrire sur le flux associé à stdout). Ainsi, une saisie à l'aide de cin force la purge du tampon du flux associé à std::cout et c'est garantit par la norme.

    En ce qui concerne la situation en C, je n'ai pas l'ouvrage de Braquellaire. A ma connaissance, les événements qui permettent de purger le tampon de stdout sont:
    • Le tampon est plein
    • Présence d'un caractère de fin de ligne
    • Appel de fflush(stdout)

    L'extrait de la norme posté plus haut n'est pas clair pour moi.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. fgets + scanf et gestion des espaces
    Par Yunchi dans le forum Débuter
    Réponses: 7
    Dernier message: 02/03/2009, 15h35
  2. Scanf, fgets et buffer.
    Par SAKDOSS dans le forum Bibliothèque standard
    Réponses: 6
    Dernier message: 15/01/2008, 08h58
  3. PB avec scanf
    Par ché dans le forum C
    Réponses: 6
    Dernier message: 13/08/2003, 07h25
  4. [debutant]la fonction scanf
    Par kalaka dans le forum C
    Réponses: 7
    Dernier message: 01/07/2003, 15h15
  5. Réponses: 6
    Dernier message: 10/09/2002, 03h35

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