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 :

[STL] pb avec in_avail()


Sujet :

SL & STL C++

  1. #1
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut [STL] pb avec in_avail()
    Bonjour,

    j'ai quelque pb avec in_avail(), je comprend pas comment l'utiliser comme je voudrais ... elle me retourne toujours 1 ou 0 ????

    voici un petit prg de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	streamsize i;
    	vector<char> v;
    	stringstream ss;
     
    	ss << "toto" << 123;
    	i = ss.rdbuf()->in_avail(); // retourne 1 ??
    	v.resize( i );
    	ss.rdbuf()->sgetn( &v[0], i );
    	i = ss.rdbuf()->in_avail(); // retourne 0 ??
    Fais-je quelquechose de mal ?

  2. #2
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Pas de réponse...
    Dois-je en conclure que la réponse est trop simple, où que la réponse existe dans FAQ (dans ce cas, toutes mes excuses), où que je suis trop impatient ?

    NB: j'utilise VC8.

  3. #3
    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
    où que je suis trop impatient ?
    Vraissemblablement

  4. #4
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    En observant comment le code suivant fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	stringstream ss2;
    	ss2 << "toto" << 123;
    	istreambuf_iterator<char> ite( ss2 );
    	while( ite != istreambuf_iterator<char>() )
    	{
    		back_inserter( v ) = *ite;
    		++ite;
    	}
    on s'aperçoit que toute la magie réside dans la fonction underflow()

    donc, en modifiant le premier exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	ss << "toto" << 123;
    	i = ss.rdbuf()->in_avail(); // i contient 1
    	v.resize( i );
    	ss.rdbuf()->sgetn( &v[0], i );
    	ss.rdbuf()->sgetc();
    	i = ss.rdbuf()->in_avail(); // i contient maintenant 6
    j'obtiens le résultat escompté, mais c'est pas joli joli...

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Par défaut
    c'est surtout que ton exemple semble bon et que faut une bonne connaissance
    du stringstream et stringbuf pour te repondre.

    1) question: pourquoi mettre une string dans un vector de char ?
    tu peux pas directement utiliser str() ?
    2) quel est le caractere que tu lis ? ne faut il pas que tu flush le stream pour que rdbuf te donne le debut du tableau ou un truc comme ca?

  6. #6
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Citation Envoyé par alskaar
    1) question: pourquoi mettre une string dans un vector de char ?
    Pour l'exemple... disons que ce que j'utilise n'est pas forcément un flux de caractères.
    Citation Envoyé par alskaar
    2) quel est le caractere que tu lis ? ne faut il pas que tu flush le stream pour que rdbuf te donne le debut du tableau ou un truc comme ca?
    Je lis le 1er caractère 't', puis dans mon 2ième exemple "oto123".
    donc le pointeur de lecture du flux est bien positionné.

    Quand on décortique stringstream, on s'aperçoit, dans le 1er exemple, que la variable contenant le nombre de caractères à lire est mis à 1 puis jamais recalculée et donc retourne 0.
    Dans le 2ième, sgetc() appelle underflow() qui, elle, met à jour la variable.

    Soit je me suis complètement fourvoyé, soit y'a comme un loup...

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Par défaut
    j'ai pas capté ce que tu peux avoir d'autre qu un char en manipulant un stringstream mais bon test plutot ce type de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	v.resize(ss.str().size());
    le desavantage c'est que tu passes par un temporaire.


    sinon pour ton exemple, sous cygwin avec g++ et donc la stl (gnu), les i sont toujours a 0 .

    avec ce genre de code ou le stream est initialise avec deja du flux dedans
    ton code marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        stringstream ss2("tata");
        i = ss2.rdbuf()->in_avail(); // = 4
        cout << i << endl;

    ma conclusion et que comme un grand nombre de stream il est compose de d'un istream et d'un ostream et tu cherches a l'utilisé comme un genre de pipe. Pour cela il te faut initialiser le ptr de lecture. apres ton ecriture

    avec ca ca marche chez moi ca me donne 7
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ss.seekg(0);
    i = ss.rdbuf()->in_avail(); 
    cout << i << endl;
    v.resize( i );
    Voila

  8. #8
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Citation Envoyé par alskaar
    j'ai pas capté ce que tu peux avoir d'autre qu un char en manipulant un stringstream
    le stringstream, c'était pour l'exemple, mais je reproduis le problème avec un stream...
    Citation Envoyé par alskaar
    mais bon test plutot ce type de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v.resize(ss.str().size());
    le desavantage c'est que tu passes par un temporaire.
    Ok, j'essaierais pour l'exemple, mais dans le cas d'un stream "brut"...
    Citation Envoyé par alskaar
    sinon pour ton exemple, sous cygwin avec g++ et donc la stl (gnu), les i sont toujours a 0 .
    Ah ?
    Citation Envoyé par alskaar
    avec ce genre de code ou le stream est initialise avec deja du flux dedans
    ton code marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        stringstream ss2("tata");
        i = ss2.rdbuf()->in_avail(); // = 4
        cout << i << endl;
    ma conclusion et que comme un grand nombre de stream il est compose de d'un istream et d'un ostream et tu cherches a l'utilisé comme un genre de pipe. Pour cela il te faut initialiser le ptr de lecture. apres ton ecriture

    avec ca ca marche chez moi ca me donne 7
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ss.seekg(0);
    i = ss.rdbuf()->in_avail(); 
    cout << i << endl;
    v.resize( i );
    Voila
    En VC8, le pointeur de lecture est correctement initialisé, mais la variable contenant le nombre de caractère (en fait le pointeur) contient 1 dès qu'on rentre quelquechose dans le strinstream avec <<. Cette variables est correctement recalculé si on extrait 1 à 1 les caractères (avec istreambuf_iterator par ex., d'ailleurs c'est comme ceci que j'ai pu repérer la fonction underflow()).
    En fait j'ai transformé mon algo pour que, dans une boucle, si in_avail() retourne 1, j'extrais le caractère, j'appelle sgetc(), je rappelle in_avail() et je sors si in_avail() retourne 0.

    En fait j'aimerais savoir si c'est le comportement attendu (par le standard) où si c'est l'implémentation qui le décide (si j'ai le courage, j'essaierais STLport) ??

    En tout cas, alskaar, Big Up pour tes recherches et tes réponses !

  9. #9
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Citation Envoyé par alskaar
    juste pour etre sure,
    le dernier code que je t ai donné marche sur mon compilo ( g++ )

    et nous avons une difference de fonctionement sur le resultat, si je fais pas de seek(0) et que je garde ton code d'origine les 2 lectures de i retourne 0

    il y a donc un pb avec ta STL je pense
    En fait, ta STL à un comportement plus simple à apréhender, qui parait plus logique (une fois qu'on à compris qu'il fallait initialiser la position de lecture du flux).
    Le comportement de ma STL est problématique, mais est-ce à dire que la STL fournie avec g++ suit le standard ? Quelqu'un peut répondre ?

Discussions similaires

  1. pb dans la stl::list avec size
    Par DEVfan dans le forum SL & STL
    Réponses: 6
    Dernier message: 10/01/2007, 18h35
  2. STL : problème avec un iterateur
    Par fabienpot dans le forum SL & STL
    Réponses: 4
    Dernier message: 06/09/2006, 09h06
  3. [STL]Problème avec map
    Par mambo dans le forum SL & STL
    Réponses: 11
    Dernier message: 27/07/2006, 15h39
  4. Probleme avec la STL(vector) avec code C
    Par Benjy dans le forum SL & STL
    Réponses: 12
    Dernier message: 06/04/2006, 12h54
  5. conteneur de la STL (problème avec DLL et COM)
    Par moldavi dans le forum MFC
    Réponses: 8
    Dernier message: 25/07/2005, 22h43

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