2012-10-15 2 views
1

pourquoi est-ce que quand je mets cin.clear() puis cin.ignore() le programme fonctionne parfaitement, ex: je mets chars et le programme ne bug pas. Mais quand je mets cin.ignore() d'abord puis cin.clear(), le programme n'arrête pas d'envoyer des signaux d'erreur.Pourquoi l'ordre est-il important?

Comment ça marche?

l'entrée ne doit-elle pas être effacée et le fail flag désactivé?

#include <iostream> 

using namespace std; 

class time 
{ 
private: 
int hours; 


public: 
void getime() 
{ 
do 
    { 
    cout << "Enter hours: "; 
    cin >> hours; 
    if (hours < 0 || hours > 23 || cin.fail() ) 
    { 
     cin.clear(); 
     cin.ignore(10,'\n'); 
     cerr << "invalid time, minutes must be between 0 and 59 " << endl; 


    } 
    }while(hours<0 || hours>23); 
} 
    }; 

int main() 
{ 
    time asd; 
    asd.getime(); 
    return 0; 
} 
+0

Envisager de reformuler la question en "pourquoi" cout << "bonjour monde"; retour; 'fonctionne et pourquoi' retour; cout << "bonjour monde"; 'ne pas?" –

+0

ouch, im noob, s'il vous plaît être doux hahah. – korek

+0

@korek cin.clear() ne fait rien dans le buffer. Il réinitialise simplement les drapeaux. En tant que tel, il ne fait probablement pas ce que vous pensez qu'il fait. –

Répondre

5

cin.clear(); cin.ignore(10,'\n'); efface les drapeaux d'erreur du flux pour le rendre à nouveau lisible, et essaie ensuite de sauter jusqu'à 10 caractères à la fin d'une ligne. Essaie d'abord d'ignorer jusqu'à 10 caractères à la fin d'une ligne (ce qui échoue et ne fait rien si le flux est dans un état d'erreur), puis efface les indicateurs d'erreur du flux pour le rendre à nouveau lisible. Ensuite, vous faites le tour de la boucle et essayez à nouveau de lire les données mal formatées qui l'ont fait échouer la dernière fois. Si la question est, "pourquoi ne puis-je pas utiliser ignore pour rejeter des données d'un flux qui est dans un état d'erreur" alors, euh, vous ne pouvez pas. La façon dont les flux sont conçus pour être utilisés est qu'ils vont dans un état d'erreur et rester là à ne rien faire jusqu'à ce que vous savez comment le réparer (et clear() pour dire que vous ignorez l'erreur) ou abandonner et quitter.

+0

merci !!, c'est tout !! :RÉ – korek

Questions connexes