Vider le buffer de cin pour reutilisation

Signaler
Messages postés
29
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
23 juin 2006
-
DeAtHCrAsH
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
-
Bonjour a tous!
Malgré mes recherches sur le forum, je n'est pas trouver reponse a mon probleme.
Bon voila, j'ai surdéfini l'operateur >> pour une classe entreprise comme suit:
istream& operator >>(istream& in, entreprise& e)
{
    char c='\0';
    string name, adress, fix, site, act, num_fax;
    bool ok=true;
    in >> c;
    if (c!='(') ok=false;
    else
    {
        in >> name>>c;
        if (c!=';') ok=false;
        else
        {
            in >> adress>>c;
            if (c!=';') ok=false;
            else
            {
                in >> fix>>c;
                if (c!=';') ok=false;
                else
                {
                    in >> site>>c;
                    if (c!=';') ok=false;
                    else
                    {
                        in >> act>>c;
                        if (c!=';') ok=false;
                        else
                        {
                            in >> num_fax>>c;
                            if (c!=')') ok=false;
                        }
                    }
                }
            }
        }
    }
    if (ok)
    {
        e.nom=name; e.adresse=adress; e.num_tel_fixe=fix; e.www=site; e.activite=act; e.fax=num_fax;
    }
    else in.clear(ios::badbit | in.rdstate());
    return in;
}

puis dans voila une fonction qui utilise celle de dessus:
void carnet::operator ++(int inutil)
{
    int ch;
    do
    {
        cout << "Vous pouvez:"<<endl
             << "\t0) Revenir au menu principal"<<endl
             << "\t1) Ajouter une fiche Entreprise"<<endl
             << "\t2) Ajouter une fiche Ami"<<endl
             << "\t3) Ajouter une fiche Famille"<<endl
             << "\t4) Ajouter une fiche Boulot"<<endl;
        do
        {   
            system("PAUSE");//Ajout pour debugger
            ch = choix_menu();
            if (cin.bad()) cout <<"cin bad"<<endl;//Ajout pour debugger
        }while((ch<0)||(ch>4));
        switch (ch)
        {
            case 0: // retour au menu précédent
                return;
            case 1: //ajout entreprise
                elem_entreprise.push_front();
                cout << "Format: ( Nom ; Adresse ; N fixe ; Site ; Activite ; N fax )"<<endl;
                //cin >> *(elem_entreprise.begin());
                if (!(cin >> *(elem_entreprise.begin())))
                {
                    elem_entreprise.erase(elem_entreprise.begin());
                    while(cin.get()!='\n') {} //essai pour vider le buffer de cin
                }
                else elem_entreprise.sort();
                break;
            case 2: //modif ami
                elem_ami.push_front();
                cout << "Format: ( Nom ; Adresse ; N fixe ; Site ; N portable ; Email ; Naissance )"<<endl;
                cin >> *(elem_ami.begin());
                elem_ami.sort();
                break;
            case 3: //modif famille
                elem_famille.push_front();
                cout << "Format: ( Nom ; Adresse ; N fixe ; Site ; N portable ; Email ; Naissance )"<<endl;
                cin >> *(elem_famille.begin());
                elem_famille.sort();
                break;
            case 4: //modif boulot
                elem_boulot.push_front();
                cout << "Format: ( Nom ; Adresse ; N fixe ; Site ; N portable ; Email ; Fonction )"<<endl;
                cin >> *(elem_boulot.begin());
                elem_boulot.sort();
        }
    }while(ch!=0);
}

Mais voila, lors de mon "essai" pour vider le buffer de cin, la fonction ne s'arrete pas.
Je vois pas le probleme.
Merci gracieusement pour votre future aide.

8 réponses

Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
essay
cin.clear();
cin.ignore('\n');
Messages postés
29
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
23 juin 2006

Merci pour ton aide, mais c bon, g pu resoudre le prob y a a peine 1 min... :)
Merci qd mm. Ca fait du bien de se faire aider de temps en temps
Messages postés
29
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
23 juin 2006

Juste par curiosité, à quoi sert la fonction cin.ignore('\n') que tu as cité?
Messages postés
29
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
23 juin 2006

Juste par curiosité, à quoi sert la fonction cin.ignore('\n') que tu as cité?
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
ca zappe tout les caracteres jusqu'a '\n', jusqu'a la fin du stream koi
Messages postés
29
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
23 juin 2006

Donc ca remplace avantageusement mon code :
while(cin.get()!='\n'){}

Merci encore.
Je debute en c++ et je voudrai m'attaquer trés prochainement au Visual C++. Tu saurais pas, par hasard, où je pourrais trouver des cours (pour visual) en français? G pa encore chercher lol.
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
n'oubli pas le cin.clear aussi

pour les cours, nan desoler, par contre je connais un livre mais ca parle essentielement des mfc
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
1
Voici 2 liens ou tu trouveras de l'aide et sur le Visual...
Le deuxieme lien est en fait une liste de cours sur le C++ .. Tu y trouveras surement de quoi faire!
Ya toute les bases avec quelques rappelles de notions et c'est plutot bien fait ...
Sans oublier l'enorme avantage que ces 2 tutoriels sont en francais et ne font pas reference a la MFC :)

http://bob.developpez.com/tutapiwin/
http://c.developpez.com/cours/

A++ et bonne continuation

Samir