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

SL & STL C++ Discussion :

que signifit cin.eof


Sujet :

SL & STL C++

  1. #1
    Membre éclairé
    Avatar de warubi
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 399
    Par défaut que signifit cin.eof
    Bonjour ! J'aimerais savoir ce qu'est cin.good et cin.eof
    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    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

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    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 à
    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
    }
    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
    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()
    }
    A noter, enfin que les codes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(cin.good()==true)
    {
        ...
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(cin.fail()!=true)
    {
        ...
    }
    réagiront également de la meme manière
    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

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par koala01
    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
    je dirais plutot a ete atteinte. En fait, il indique que l'operation suivante echouera a cause de la fin du fichier.
    • failbit: indique que l'opération suivante échouera
    Non. Il indique qu'une operation anterieure a echoue.
    • goodbit indique que l'opération suivante a des chances de réussir
    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.

    • 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)
    Non. fail() renvoie (rdstate() & (failbit | badbit)) != 0
    • bad(): renvoie l'état de badbit (booléen)
    • good(): renvoie l'état de good (booléen)
    good renvoie rdstate() == 0
    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.

    A noter, enfin que les codes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(cin.good()==true)
    {
        ...
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(cin.fail()!=true)
    {
        ...
    }
    réagiront également de la meme manière
    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:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (std::getline(cin, line)) { 
    ...
    }
    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).

  5. #5
    Membre éclairé
    Avatar de warubi
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 399
    Par défaut
    Merci pour votre eclair

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    • failbit: indique que l'opération suivante échouera
    Non. Il indique qu'une operation anterieure a echoue.
    Et pourtant, le stroutrup écrit (page 685: chapitre 21.3.3: état d'un flux)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    (...)
    bool fail() const; //l'opération suivante échouera
    (...)
    (et un peu plus loin, le meme commentaire concernant failbit)

    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

  7. #7
    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 koala01
    Et pourtant, le stroutrup écrit (page 685: chapitre 21.3.3: état d'un flux)
    Version ? Edition ? Révision ? (c'est pas corrigé dans les errata?)

    Citation Envoyé par ISOIEC14882-1998, §27.4.2.1.3, Table 85, p 608
    failbit indicates that an input operation failed to read the expected characters, or than an output operation failed to generate the desired characters.
    (Je n'ai pas vérifié s'il y avait eu un "patch" dans la révision de 2001.)

    Soit, c'est bien positioné après avoir tenté d'injecter ou d'extraire. En fait, comment pourrait-il en être autrement ? Et évidemment, la prochaine opération foirera, vu que la dernière a déjà été plantée.
    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...

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Evidemment avec les versions qui se succedent...

    Celle dont je dispose est la Quatrième édition (version francaise) achevé d'imprimé le 16/02/2001, sans errata...

    Dans cette édition, on lit:
    Citation Envoyé par stroutrup
    (...)
    Si l'état est good(), l'opération d'entrée précédente a réussi. Dans ce cas, l'opération suivante devrait également aboutir. Dans le cas contraire, elle échouera. Appliquer une opération d'entrée sur un flux qui ne se trouve pas en état good() est une opération nulle. Si nous tentons de lire une variable v et si l'opération échoue, v restera inchangée (elle est inchangée lorsque v est une variable de l'un des type traités par les fontions membres d'istream ou d'ostream).

    La différence entre les états fail() et bad() est assez subtile. Lorsque l'état est fail(), on suppose que le flux n'est pas corrompu et qu'aucun caractère n'a été perdu. Cela n'est pas le cas lorsque l'état est bad()

    L'état d'un flux est représenté sous la forme d'un ensemble d'indicateurs. Comme la plupart des constantes utilisées pour représenter le comportement des flux, ces indicateurs sont définis dans la classe ios_base de basic_ios(...)
    Suis l'exemple de code suivant (apres avoir indiqué la partie de la classe ios_base qui contient les flags)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void f()
    {
        ios_base::iostate s=cin.rdstate();    //retoune un ensemble de bits iostate
     
        if(s& ios_base::badbit){
            //les caractères de cin sont peut etre perdus
        }
        //...
        cin.setstate(ios_base::failbit);
        //...
    }
    Je sais que la version anglaise en est à la cinquième édition, mais ici, il présente l'état fail() comme étant le fait que l'action suivante échoueras (ce qui, de fait, est logique si l'action précédente a échoué)... non comme le fait que l'action précédente a échoué

    Maintenant, il n'est pas du tout exclu qu'il se soit trompé dans cette édition (apres tout, l'erreur est humaine )

    Et, effectivement, il semble bien plus logique que failbit (et les autres) représentent l'état apres la dernière action effectuée, et non "en prévision de l'action suivante"
    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

  9. #9
    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
    Non, non. Même la version française ne devrait pas avoir dépassé la 3e ed -- comment s'y retouver après. http://www.research.att.com/~bs/3rd.html

    Par contre, la VF a subit une révision technique conséquence (j'ai envie de dire majeure) par Michel Michaud. Je ne sais pas si le nom de Michel apparait en clair dans le bouquin, ou pas.
    Si je me souviens bien, il est à l'origine de l'introduction d'un lexique donnant diverses traductions des termes consacrés au C++.


    Quant à "f()", j'ai du mal à lui faire dire quoique ce soit avec les "...".

    Mais effectivement, sa VO semble proche (et de bien parler de "next operation will fail"), les errata n'ayant corrigé qu'un autre détail sur lequel on ne pinaillait pas.
    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...

  10. #10
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Et pourtant, je t'assure que, bien que tapant en aveugle par habitude, j'ai écrit in extenso ce qui se trouvait dans le bouquin (pour information, la version que j'ai, c'est le code ISBN 2-7440-1089-8 "spécial édition" de chez campuspress, et la seule mention qui soit présente quant à la version est cette phrase "pour cette quatrième édition,(...) au dos du livre)
    [EDIT]le plus bisard, dans l'histoire, c'est que, ni la couverture, ni le numero ISBN ne correspondent avec ton lien (l'image "C++" sur une vague se trouve au dessu du "le langage C++" chez moi) ...[/EDIT]
    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

  11. #11
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Quand j'aurais le temps et mon édition sous la main (ici je n'ai que la deuxième édition), je vérifierai ce qui y est écrit en tenant compte des errata et enverrai éventuellement une suggestion d'errata supplémentaire à BS.

    Si l'état est good(), l'opération d'entrée précédente a réussi.
    Pas nécessairement. L'état peut ne pas être good() parce que la fin de fichier a été atteinte mais l'opération d'entrée avoir réussit quand même.

    Dans ce cas, l'opération suivante devrait également aboutir.
    La plupart des entrées qui foirent ont été précédée d'une entrée qui a réussit... Si la plupart des entrées effectuées quand good() est vrai réussissent, c'est parce que la plupart des entrées réussissent.

    Dans le cas contraire, elle échouera.
    Effectivement, si l'état n'est pas good(), l'entrée suivante échouera. Ne fut-ce que parce que c'est ce que vérifie un sentry.

    Appliquer une opération d'entrée sur un flux qui ne se trouve pas en état good() est une opération nulle. Si nous tentons de lire une variable v et si l'opération échoue, v restera inchangée (elle est inchangée lorsque v est une variable de l'un des type traités par les fontions membres d'istream ou d'ostream).
    Je ne suis pas sûr que ce soit vrai. Je me souviens avoir essayé de retrouver cette garantie dans la norme sans y arriver.

    La différence entre les états fail() et bad() est assez subtile. Lorsque l'état est fail(), on suppose que le flux n'est pas corrompu et qu'aucun caractère n'a été perdu. Cela n'est pas le cas lorsque l'état est bad()
    C'est la différence entre avoir le failbit et le badbit positionné. Mais fail() teste aussi le badbit.

  12. #12
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Luc Hermitte
    Par contre, la VF a subit une révision technique conséquence (j'ai envie de dire majeure) par Michel Michaud. Je ne sais pas si le nom de Michel apparait en clair dans le bouquin, ou pas.
    Il me semble que oui. 2001 me semble vieux pour être la version revue par Michel.

  13. #13
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Relisant la version anglaise, je ne vois rien d'incorrect. Les deux gros points que j'avais:

    If the state is good() the previous input operation succeeded.
    C'est vrai. Mais il ne faut pas en conclure que si l'etat n'est pas good(), l'operation precedante avait echoue.

    The difference between the states fail() and bad() is subtle. When the state is fail() but not also bad(), it is assumed...
    La partie que j'ai citee en gras n'est pas dans le texte que tu as cite (et ne se trouve pas dans le texte francais que j'ai sous la main; au fait Michel Michaud est remercie sur la page de copyright).

  14. #14
    Membre éclairé
    Avatar de warubi
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 399
    Par défaut
    Merci encore pour toutes ces precisions !

Discussions similaires

  1. [EDI] Quel est l'éditeur que vous recommandez pour PHP ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 400
    Dernier message: 10/04/2018, 20h08
  2. "/O", même signification que EOF ?
    Par Learner_ dans le forum Débuter
    Réponses: 29
    Dernier message: 19/01/2013, 22h48
  3. tant que pas eof alors
    Par luchoo dans le forum ASP.NET
    Réponses: 6
    Dernier message: 25/07/2011, 10h24
  4. Erreur EOF que je ne comprends pas :s
    Par Anthos59 dans le forum ASP
    Réponses: 3
    Dernier message: 10/04/2006, 23h06
  5. Que doit contenir un dossier de programmation ?
    Par b30ff dans le forum Débats sur le développement - Le Best Of
    Réponses: 11
    Dernier message: 26/06/2004, 19h09

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