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
|