Afficher un message
Vieux 09/04/2008, 08h47   #3
James Kanze
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Probleme avec istringstream

On Apr 8, 5:16 pm, Guillaume GOURDIN <tr...@hotmail.com> wrote:
> Bonjour à tous, j'ai un problème avec le code suivant :


> #include <sstream>
> #include <iostream>
> #include <stdint.h>
> using namespace std;


> int main(int argc, char ** argv)
> {
> string s("endor ID Low Byte");
> istringstream iss;
> uint32_t tmp;


> iss.str( s );


> if ( !(iss >> hex >> tmp) )
> {
> return ( false );
> }


> cout << tmp << endl;


> return ( true );
> }


> Pour ce code, "endor ID Low Byte" est une représentation
> hexadécimal de 14... Quelqu'un peut-il me dire ce que je fais
> pas bien?


Rien. Ta chaîne commence bien par un nombre hexadécimal qui a la
valeur 14. Si tu veux vérifer que c'est tout ce qu'il
contient :

if ( iss >> std::hex >> tmp >> std::ws
&& iss.get() == EOF ) {
// c'est bon
}

Attention, en revanche. J'ai déjà rencontré des manipulateur
std::ws qui positionnait failbit s'il était déjà à la fin (parce
qu'il construisait un istream::sentry avant de commencer à
lire), bien qu'un manipulateur ne doit jamais positionner
failbit. Dans ce cas-là (c'était STL port, je crois), la
solution la plus simple, c'est d'écrire toi-même un manipulateur
ws, quelque chose comme :

std::istream&
ws( std::istream& source )
{
if ( source.good() ) {
std::ctype< char > const&
ctype = getFacet( source.getloc() ) ;
std::streambuf* sb = source.rdbuf() ;
int c = sb->sgetc() ;
while ( c != EOF
&& ctype.is( std::ctype_base::space,
static_cast< char >( c ) ) ) {
c = sb->snextc() ;
}
if ( c == EOF ) {
source.setstate( std::ios::eofbit ) ;
}
}
return source ;
}

(Ici, getFacet est plus ou moins std::get_facet, avec des
work-arounds pour d'autres erreurs dans une autre bibliothèque,
et qui renvoie un proxy, de façon à que tu n'aies pas besoin de
répéter le type.)

--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
  Réponse avec citation
 
Page generated in 0,06494 seconds with 9 queries