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 :

istream::getline(...) et statut d'erreur ???


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 25
    Par défaut istream::getline(...) et statut d'erreur ???
    bonjour.
    Je n'arrive pas à comprendre dans quel cas cette fonction active le bit d'erreur failbit.
    J'ai la documentation suivante de chez Dinkum:
    basic_istream& getline(char_type *str, streamsize count,
    char_type delim);

    The function extracts up to count - 1 elements and stores them in the array beginning at str. It always stores char_type() after any extracted elements it stores. In order of testing, extraction stops:

    at end of file
    after the function extracts an element that compares equal to delim, in which case the element is neither put back nor appended to the controlled sequence
    after the function extracts count - 1 elements
    If the function extracts no elements or count - 1 elements, it calls setstate(failbit). In any case, it returns *this.
    mon programme de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include<iostream>
    #include<istream>
    using namespace std;
     
    char t[20];
    char tt[20];
    int main() {
         cin.getline(t,5);
         cout<<cin.rdstate()<<endl;
         cout<<t<<endl;
         cin.getline(tt,5);
         return 0;
    }
    si je teste en saisissant "abcd'retour charriot'" le failbit ne s'active pas et pas de problème.(Mais ici lors de la premiere lecture 4 caractères sont extraits ("abcd") et d'après la documentation précédente le failbit devrait s'activer....)
    Mais si je teste avec cette fois "abcde'retour charriot'" le failbit s'active (rdstate=4) et la seconde lecture est évidemment impossible.Pourtant d'apres la doc 4 caractère sont chargés ("abcd") et je pense donc etre un peu dans la meme situation que précédemment.Je pensais alors que la seconde saisie prendrait ce qui reste à savoir "e'retour charriot'"..

    Je n'ai pas réussi à trouver une doc qui me réponde à cette question à moins que je n'ai pas compris celle-çi...
    Merci de votre aide !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    [quote] basic_istream<charT,traits>& getline(char_type* s, streamsize n,
    char_type delim);

    Effects:
    Extracts characters and stores them into successive locations of an
    array whose first element is designated by s.25) Characters are
    extracted and stored until one of the following occurs:

    1)end-of-file occurs on the input sequence (in which case the function
    calls setstate(eofbit));

    2)c == delim for the next available input character c (in which case
    the input character is extracted but not stored);26)

    3)n - 1 characters are stored (in which case the function calls set-
    state(failbit)).

    4 These conditions are tested in the order shown.27)

    [...]

    27) This allows an input line which exactly fills the buffer, without
    setting failbit. This is different behavior than the historical AT&T
    implementation.

    Voila qui devrait répondre à ta question.
    Dans le 1er cas, le caractère delim ou eof est rencontré -> sortie sans failbit
    Dans le 2eme cas, un autre caractère est rencontré, count-1 caractères copiés et sortie avec failbit.

  3. #3
    Membre émérite Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Par défaut
    En C++, main doit retourner un int.
    En C++ toujours, les talbeaux de char sont obsolètes dans la plupart des cas...

  4. #4
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 25
    Par défaut
    merci !
    Cependant j'ai quand meme un doute ... :
    avec "abcd/n" :
    'a'-->stored and charged
    'b'-->stored and charged
    'c'-->stored and charged
    ...jusqu'ici pas de problème
    'd' n'est pas le caractère delim donc 'd'-->stored and charged
    Mais alors 4 carctère ont été rangés dans le tableau et ... le failbit devrait s'activer.... ?
    le test pour savoir combien de caractère ont été chargés aurait t'il lieu AVANT de tester la troisième condition ??

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    Cas de la chaine "abcd\n" avec n = 5 (n-1 = 4 ^^)
    'a','b','c' .. pas de problème

    'd' apparait dans la séquence:
    1/ si EOF on sort : NON
    2/ si delim on sort : NON
    3/ si n-1 caractères stoqués on sort et failbit : NON, on n'a stoqué que 'a','b' et 'c' pour l'instant (3 < 4)
    Donc extraction et stoquage de 'd'.

    '\n' apparait sur la séquence
    1/ si EOF on sort : NON
    2/ si delim on sort : OUI (avec extraction sans stockage de '\n')

    et voila...
    Ce n'est pas exactement dans ce sens là que c'est expliqué, mais la doc parle de considérer le caractère suivant pour EOF et delim, donc ça revient au même.

  6. #6
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 25
    Par défaut
    merci beaucoup volune !!!
    tout est clair !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur wistringstream et getline
    Par NLS le pingouin dans le forum Visual C++
    Réponses: 1
    Dernier message: 14/06/2012, 10h51
  2. Réponses: 0
    Dernier message: 17/10/2011, 14h12
  3. erreur ifstream / getline
    Par le_fif dans le forum C++
    Réponses: 3
    Dernier message: 05/10/2009, 11h57
  4. Erreur : index passé en statut "unusable "
    Par zaineb.z dans le forum SQL
    Réponses: 6
    Dernier message: 19/06/2008, 15h14
  5. XMLHttpRequest - Passage du statut 2 à 4 => erreur de statut
    Par nerick dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 06/12/2006, 17h39

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