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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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