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 :

Pause dans un programme & v�rification


Sujet :

C++

  1. #1
    Membre confirm� Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Par d�faut Pause dans un programme & v�rification
    Bonjour ceci est un probl�me avec un code de la FAQ et le fait de vouloir faire une pause ensuite.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include <iostream> 
    #include <limits>
     
    using namespace std;
     
    bool read_choice( int & N )
    {
        cout << "Entrez un chiffre entre 1 et 6 : " ; 
        while ( ! ( cin >> N ) || N < 1 || N > 6 )
        { 
            if ( cin.eof() )
            { 
                // ^D  (^Z sous windows); Fin du flux d'entree!
                return false; 
            }
            else if ( cin.fail() )
            { 
                cout << "Saisie incorrecte, recommencez : "; 
                cin.clear(); 
                cin.ignore( numeric_limits<streamsize>::max(), '\n' );
            }
            else
            {
                cout << "Le chiffre n'est pas entre 1 et 6, recommencez : ";
            }
        }
        return true; // succès
    }
     
    int main () 
    { 
        int choix;
        if ( read_choice( choix ) )
        {
            cout << "Vous avez choisi : " << choix << '\n';
        }
     
        cout << "Appuyez sur entree pour continuer...\n";
        cin.ignore( numeric_limits<streamsize>::max(), '\n' );
        // cin.ignore( numeric_limits<streamsize>::max(), '\n' ); obligé de le mettre une autre fois car on a appuyé sur entrée
        return 0; 
    }
    Je voudrais savoir s'il est possible de faire ce que je veux sans rajouter un 2�me cin.ignore().
    Je pourrais mettre getchar() pour recuperer le '\n' en trop mais je voudrais savoir s'il y a une m�thode plus �l�gante.

    Merci d'avance.

  2. #2
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    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 296
    Par d�faut
    Ce n'est pas de getchar() dont tu as besoin, mais de get-all-char-till('\n'). En clair, de ignore().
    Car tu n'as aucun moyen de savoir la quantit� de caract�res parasites qui ont p� �tre saisis apr�s les caract�res constituant ton nombre.

    Accessoirement, le read_choice est bloquant jusqu'� saisi d'un nombre acceptable, ou jusqu'� la fermeture de cin. Et une fois ferm�, aucune pause ne sera possible de la sorte.
    Bref, ton main peut devenir:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
        if (!read_choice(.....)) 
            return EXIT_FAILURE;
     
        ... traitements nominaux.
        return EXIT_SUCCESS;
    }
    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...

  3. #3
    Membre confirm� Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Par d�faut
    Citation Envoy� par Luc Hermitte
    Bref, ton main peut devenir:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    if (!read_choice(.....)) 
      return EXIT_FAILURE;   
     
    ... traitements nominaux. 
    return EXIT_SUCCESS; }
    Je ne vois pas comment cela r�soud mon probl�me ?
    Je ne peux toujours pas faire une "pause" en appuyant sur entr�e.

    Ce qui se passe.
    Je demande le nombre d'it�rations pour une simulation et entre chaque it�ration je demande d'appuyer sur entr�e pour passer � la suivante.
    Les deux premi�res sont ex�cut�es alors que je n'ai pas appuy� sur entr�e.

    La solution que tu laisses entendre c'est de faire un deuxi�me cin.ignore.
    Donc je suis oblig� de faire ceci pour avoir le comportement que j'attends.

    A moins que dans traitement nominaux tu pensais � un cin.ignore et l� je dis ok.

  4. #4
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    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 296
    Par d�faut
    Citation Envoy� par b Oo
    Je ne vois pas comment cela r�soud mon probl�me ?
    "Bref" == conclusion de la seconde partie de mon post. Cela concerne de la r�soution du bug que tu n'as pas vu (i.e. fais un ctrl-D dans ta console (/ctrl-Z sous $COMSPEC sous windows/dos))


    La solution que tu laisses entendre c'est de faire un deuxi�me cin.ignore.
    Donc je suis oblig� de faire ceci pour avoir le comportement que j'attends.
    Oui. Le premier purge la fin de ligne courante (chose que >> ne fait pas). Le second r�alise la pause. C'est comme �a.
    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� Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Par d�faut
    Ok j'ai compris ce que tu voulais dire !
    C'est que si je fais un ^C ou ^D ou ^Z (en fonction du syst�me) cela me renvoie faux mais mon programme continu.
    Et l� tu dis que ma pause ne pourra plus fonctionner avec le cin.ignore().

    Merci pour l'explication

  6. #6
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    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 296
    Par d�faut
    ^C va interrompre ton programme -- ou finir dans un handler que tu auras enregistr�)

    ^D (/^Z) va fermer le flot entrant stdin. Tu ne pourra alors plus rien faire avec stdin/std::cin. C'est comme si tu avais fait un
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    // toto.cpp
    #include <string>
    #include <iostream>
    int main() {
       std::string mot;
       while (std::cin >> mot) std::cout << mot << "\n";
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    $> echo "mot1 mot2 mot3" | ./toto
    Ce programme affiche chaque mot sur une ligne et se termine gentillement, car le flux entrant se termine apr�s "mot3". Exactement de la m�me fa�on, tu peux taper
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    $> ./toto
    mot1 mot2 mot3<entree><c-d>
    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...

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Mettre une pause dans un programme
    Par PNL dans le forum G�n�ral Java
    R�ponses: 12
    Dernier message: 28/01/2016, 00h54
  2. R�ponses: 9
    Dernier message: 18/12/2009, 00h36
  3. [D�butant] Pause dans un programme en mode console ?
    Par pugnator dans le forum Langage
    R�ponses: 2
    Dernier message: 15/12/2006, 12h08
  4. Pause dans un programme Pro*C
    Par Veve44 dans le forum C
    R�ponses: 5
    Dernier message: 11/10/2005, 17h49
  5. Faire une pause dans le programme
    Par shinobi dans le forum Access
    R�ponses: 6
    Dernier message: 13/06/2005, 16h37

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