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