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 :

conversion avec istringstream


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut conversion avec istringstream
    Bonjour,

    Dans une classe de type T j' ai une méthode qui convertit une string en types simples. Cela marche pour tous les types char, short, int, float, double, long double, sauf pour ...les string !

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    template < typename T >
    class A 
    {  T g_val ;
        public :
        ...
        ...
     void  setValue( const std::string& s )
      { std::istringstream is( s );
        is  >>  g_val ;  
      }
     
    } ;
    La convertion de string vers string s' arrête dès l' espace rencontré aprés les caractères.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    A<std::string> A( "hello world" ) ;   =>ok normal
     
    A.setValue("toto") ; ok 
     
    mais 
     
    A.setValue( "bonjour monde") ; erreur seul "bonjour" est traduit.
    Pourtant l' appel à std::istringstream.str() renvoît bien la chaîne entière.
    Comment faire pour forcer le flux à renvoyer tous les caractères qu' il contient, y compris les espaces ?

    Cordialement.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    La convertion de string vers string s' arrête dès l' espace rencontré aprés les caractères.
    Spécialise tout simplement la conversion vers string.

  3. #3
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut conversion avec istringstream
    Bonjour,

    Impossible de spécialiser, g_value est toujours de type T, ce qui pose problème dans un vecteur de classe de base .

    bool A::setValue( const std::string& s ) est en fait dérivé d' une classe mère AA ;

    Néanmoins j' ai trouvé une solution, peu esthétique, pour éviter l' echec de conversion de istringstream vers string.

    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
     
    bool setValue( const std::string& s )
      { if( std::string("Ss") == std::string(typeid(T).name())  )
        { void * v1 = ( void * ) s.c_str()  ;
          g_val = *( T* ) &v1    ;
          return true ;
        }
     
        std::string tmp  ;
        std::string::size_type i = s.find_last_not_of( ' ' );
        if ( i != std::string::npos )
        tmp = s.substr( 0, i + 1 ) ;
        std::istringstream is( tmp );
        T v1;
        if ( ! ( is >> v1 ) || ! is.eof() ) return false ;
        g_val = v1 ;
        return true;
      }
    Si vous avez une meilleure idée, n' hésitez pas.

    Cordialement.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Impossible de spécialiser
    Il suffit de définir
    void A<std::string>::setValue( const std::string& s )

    Ce qui sera plus rapide que ta solution basé sur le RTTI.

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Bonjour,

    Effectivement j' ai pu spécialiser comme l' indique loufoque. C' est une solution plus élégante et plus rapide.

    Mais à l' origine comment faire en sorte qu' un istringstream vide tous ses octets dans un string ?
    Si c' est possible.

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::string z( "hello world") ;
    std::string  v  ;
    std::istringstream is( z ) ;
    is >>  v ;
    std::cout << v << std::endl ;  // ===>  raté !
    Cordialement.l

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Mais à l' origine comment faire en sorte qu' un istringstream vide tous ses octets dans un string ?
    En utilisant is.read() jusqu'à atteindre la fin du flux.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/02/2014, 11h01
  2. Souci de conversion avec XMLHttpRequest
    Par Christophe Charron dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/03/2006, 13h19
  3. Problème de conversion avec CONVERT
    Par gowser dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/12/2005, 16h48
  4. Conversion avec template
    Par indy2 dans le forum Langage
    Réponses: 10
    Dernier message: 23/03/2005, 00h02
  5. Réponses: 5
    Dernier message: 12/01/2005, 20h58

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