Bonjour ! J'aimerais savoir ce qu'est cin.good et cin.eof
Merci d'avance
Bonjour ! J'aimerais savoir ce qu'est cin.good et cin.eof
Merci d'avance
Pour ce genre de question le plus rapide est de consulter ta doc de référence préférée ; tu en trouveras tout un tas dans la FAQ si tu n'en connais pas.
http://c.developpez.com/faq/cpp/?pag...ERALITE_cppdoc
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Salut,
De manière générale, cin est un gestionnaire de flux d'entrée, tout comme pourrait l'etre les autres i*stream.
A ce titre, il dispose de plusieurs "drapeaux" (flags) qui permettent de se faire une idée de l'état du flux sur lequel il travaille.
Ainsi, on trouve, dans la classe ios_base, les drapeaux suivants, dont cin dispose:
- badbit: indique que le flux est corrompu
- eofbit:indique que la fin du fichier est atteinte
- failbit: indique que l'opération suivante échouera
- goodbit indique que l'opération suivante a des chances de réussir
Evidemment, failbit est intimement lié à badbit et à eofbit, et goodbit ne peut pas etre vrai en meme temps que failbit
et, dans les gestionnaire de flux, on trouve les méthodes
- rdstate(): renvoye les quatre bits sous la forme dun ios_base::iostate
- eof(): renvoie l'état de eofbit (booléen)
- fail(): renvoie l'état de failbit (booléen)
- bad(): renvoie l'état de badbit (booléen)
- good(): renvoie l'état de good (booléen)
Cela signifie que tu peux envisager des codes ressemblant à
qui réagira, en définitive, de la meme manière que
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 if( cin.eof()) { // ici, la fin du flux est atteinte } if(cin.bad()) { // ici, le flux est corrompu (il arrive qu'il y ai " // des souris" dans les cables ;)) } if(cin.fail()) { // ca ne sert à rien d'essayer d'encore accéder au flux // soit parce que sa fin est atteinte, soit parce qu'il est corrompu } if(cin.good()) { // *normalement* on peut tenter d'accéder au flux }
A noter, enfin que les codes
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 //récupération de l'état du flux ios_base::isotate etat=cin.rdstate(); // on vérifie si badbit est à 1 avec un ou binaire if(etat & ios_base::badbit) { //le flux est corrompu } //meme chose avec failbit if(etat & ios_base::failbit) { //équivalent à cin.fail() } // toujours pareil avec eofbit if(etat & ios_base::eofbit) { //correspond à cin.eof() } // et pareil avec goodbit if(etat & ios_base::goodbit) { // correspond à cin.good() }
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 while(cin.good()==true) { ... }
réagiront également de la meme manière
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 while(cin.fail()!=true) { ... }![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
je dirais plutot a ete atteinte. En fait, il indique que l'operation suivante echouera a cause de la fin du fichier.Envoyé par koala01
Non. Il indique qu'une operation anterieure a echoue.
- failbit: indique que l'opération suivante échouera
Non. Il n'y a pas reellement de goodbit independant des autres. C'est une constante a utiliser quand les trois autres ne sont pas de mise.
- goodbit indique que l'opération suivante a des chances de réussir
Non. fail() renvoie (rdstate() & (failbit | badbit)) != 0
- rdstate(): renvoye les quatre bits sous la forme dun ios_base::iostate
- eof(): renvoie l'état de eofbit (booléen)
- fail(): renvoie l'état de failbit (booléen)
good renvoie rdstate() == 0
- bad(): renvoie l'état de badbit (booléen)
- good(): renvoie l'état de good (booléen)
Il faut aussi citer les plus utilises: operator void*() qui retourne un pointeur non NULL si !fail() et operator!() qui est un synonyme de fail() mais a l'avantage d'un nom n'induisant pas en erreur.
Je ne suis pas sur de ce que tu veux ecrire. Le code que tu donnes est generalement un erreur. La technique en C et en C++, c'est de tenter l'operation d'IO et d'ensuite tester si elle a reussit. Generalement d'ailleurs avec operator void* (c'est pas toujours tres clair mais c'est la methode idiomatique, ce qui fait que les alternatives sont encore moins claires parce qu'on se demande si elles sont correctes ou pas; generalement elles ne le sont pas). Par exemple:A noter, enfin que les codes
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 while(cin.good()==true) { ... }
réagiront également de la meme manière
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 while(cin.fail()!=true) { ... }![]()
On peut utiliser ensuite eof(), fail() et bad() pour tenter de discerner s'il y a probleme, ou simplement la fin normale du fichier mais le degre de descernement est relativement faible (par exemple avec eof() retournant true on sait que la fin de fichier a ete atteinte, mais on ne sait pas si l'IO a echoue a cause de cela ou d'une autre raison si la methode utilisee pour faire les IO permet une autre raison).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 while (std::getline(cin, line)) { ... }
Et pourtant, le stroutrup écrit (page 685: chapitre 21.3.3: état d'un flux)Non. Il indique qu'une operation anterieure a echoue.
- failbit: indique que l'opération suivante échouera
(et un peu plus loin, le meme commentaire concernant failbit)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 (...) bool fail() const; //l'opération suivante échouera (...)
Si l'on a, de fait, de fortes chances qu'une opération échouera si la précédente a échoué, stroutrup ne parle pas du tout de l'opération précédente...
De plus, dans les pages qui ont trait au flux, il utilise à plusieurs reprises les morceaux de code tels que je les ai montrés (pas tous ensemble, je te l'accorde)
Je ne dis absolument pas que je trouve les codes proposés faciles à utiliser, mais... qu'ils sont sensés etre corrects...
Je sais aussi que stroutrup a été attaqué par d'autres pointures, mais... dans le cas qui nous intéresse, a-t-il tord ou raison![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Partager