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 :

[Console] Tampon de sortie et endl


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 155
    Par défaut [Console] Tampon de sortie et endl
    Bonjour à tous,

    Bon, tout d'abord je certifie avoir fait une recherche, avoir lu la FAQ C++ et avoir regardé dans mon manuel de référence avant de poser ma question.

    Voilà j'aimerais savoir pourquoi il n'est pas possible, lorsqu'on désire mettre une pause en fin de programme, de vider le tampon de sortie des retours chariots avec : cout << endl; ?

    En d'autres termes, pourquoi est-on obligé d'utilise le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    endl sert aussi à vider le buffer de sortie donc je me demande bien pourquoi il ne vide pas aussi les '\n' (quoique le code ci dessus fonctionne très bien hein, c'est juste une curiosité de ma part ... )

    merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Par défaut
    Salut !
    cin et cout sont deux flux indépendants, faire un flush sur cout (flux de sortie) ne touche pas du tout à cin.
    pour faire une pause, on laisse passer tous le contenu de cin jusqu'à disposer d'un \n correspondant à un retour chariot.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 155
    Par défaut
    Ah oui évidemment, moi je mélange les flux, pas malin ...
    Il n'y a pas moyen de faire un flush sur cin ?

    merci

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    Si. Avec ignore.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 155
    Par défaut
    Ah bon.
    En fait maintenant que j'y pense il me semble que ces confusions viennent du langage C, étant donné qu'en C si je me souvient bien pour vider le buffer d'entrée on faisait :

    Ca doit être ça qui m'a induit en confusion ...

    merci !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Par défaut
    hmmmm .... va faire un tour sur le forum C, mais je crois qu'un fflush(stdin) n'est pas vraiment la solution la plus fiable ..?
    Et alors mélanger l'utilisation de cin et stdin, ça donne quoi ?

  7. #7
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Bonjour,

    FFlush(stdin) n'est pas défini par la norme ANSI sur les systèmes Posix.

    Il n'est défini que sous Dos, Windows ...

    De manière générale, il faut éviter de mélanger cin/cout et stdin/stdout dans le même code, ainsi que leurs routines respectives.

    Ici, la bonne méthode en C++ est d'utiliser cin.ignore(...) commpe indiquer dans la FAQ.

    En C, résussir à vider le flux d'entrée stdin pour la norme Posix est assez difficile, voir FAQ C.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 116
    Par défaut
    mais quel est l'avantage de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    sur
    ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 155
    Par défaut
    Non pas de problèmes, pour moi la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     cin.ignore(numeric_limits<streamsize>::max(), '\n');
    me convient très bien. Ma remarque concernant stdin était juste destinée à expliquer mon erreur ...

    Sinon TheRedLed, que veux tu dire par la ? cin.get() c'est juste pour récupérer un caractère au clavier non ? cin.ignore() ne récupère rien du tout, il "zappe" juste les caractères dont on a pas besoin ...

    merci à tous

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    On sort souvent du cin.get ou du cin.ignore pour faire une pause, mais derrière tout ça il faut savoir ce que ça fait vraiment.

    La pause n'est qu'un effet de bord :

    - cin.get va récupérer un caractère sur l'entrée standard, c'est-à-dire que si celle-ci n'est pas vide tu n'auras aucune pause.
    - cin.ignore va par contre ignorer tous les caractères jusqu'à tomber sur un '\n', autant ceux qui se trouvent déjà sur l'entrée standard que ceux que tu vas saisir. Il faudra donc bien attendre la saisie d'un '\n' pour continuer, d'où la pause.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 155
    Par défaut
    Au fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    C'est compatible avec le standard ANSI/ISO ?

    merci

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 116
    Par défaut
    Citation Envoyé par Loulou24
    - cin.get va récupérer un caractère sur l'entrée standard, c'est-à-dire que si celle-ci n'est pas vide tu n'auras aucune pause.
    Alors c'est pour ça que j'ai des pb des fois... je savais bien qu'il y avait un truc
    Ya-t-il un moyen de vider l'entrée standard avant cin.get() ? avec cin.flush() peut-être ?

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 155
    Par défaut
    J'ai posé cette question si dessus et apparament non, avec ignore() uniquement ...

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 116
    Par défaut
    C'est pas clair pour moi là...
    - cin.ignore va par contre ignorer tous les caractères jusqu'à tomber sur un '\n', autant ceux qui se trouvent déjà sur l'entrée standard que ceux que tu vas saisir. Il faudra donc bien attendre la saisie d'un '\n' pour continuer, d'où la pause.
    Donc avec cin.ignore si par malheur un '\n' est présent dans le buffer, il n'y aura pas de pause non plus... La probabilité est certes moins grande que cin.get(), mais elle est bien là... donc le problème demeure.

    Il doit bien y avoir une combine pour vider le tampon entièrement d'un coup non, avec ignore() ?

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    La combine c'est justement cin.ignore. En théorie il ne devrait jamais y avoir de '\n' dans le buffer d'entrée, puisque je pense que l'appui sur entrée le vide. Enfin à vérifier tout de même.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 116
    Par défaut
    Avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
    #include <windows.h>
     
    using namespace std;
     
    int main()
    {
      cout << "hey ! \n";
      Sleep(1000);
      cout << "sleep fini\n";
      cin.ignore(numeric_limits<streamsize>::max(), '\n');
      return 0;
    }
    Si on appuye sur entrée pendant Sleep(1000), cin.ignore() le prend en compte et le message "sleep fini" n'apparait pas (si la console se ferme automatiquement).

  17. #17
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    Ignore fait une purge jusqu'au prochain '\n' ...
    AMHA, si on veut faire des trucs plus compliqués, on utilise des API plus reéactives.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 155
    Par défaut
    En ce qui me concerne mon problème est résolut, je dois mettre le tag [ résolut] malgré que vous continuez à discuter ou pas ?

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 116
    Par défaut
    à mon avis ouaip

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Console] Désactiver les sorties de thread
    Par CIFQ_Drew dans le forum Visual Studio
    Réponses: 1
    Dernier message: 18/11/2010, 00h16
  2. [console]Récupérer la sortie d'un programme console (débutant)
    Par Moravski dans le forum GTK+ avec C & C++
    Réponses: 9
    Dernier message: 14/02/2010, 10h37
  3. Réponses: 2
    Dernier message: 10/10/2009, 17h59

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