Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

EConversion string vers int

6 réponses
Avatar
Guillaume GOURDIN
Bonjour à tous, j'ai encore une petite question. Voilà, j'ai le code
suivant:

std::string str_value;
std::stringstream str_strm;

str_strm.str( str_value );
str_strm >> value;

if ( str_strm.fail() == true )
{
return ( false );
}

avec 'str_value' qui vaut par ex. "0x55". A la fin de l'éxecution de ce
code, 'value' vaut 0, et je tombe pas sur le 'return ( false )'.
Qu'ai-je raté?

Merci pour votre aide précieuse.

6 réponses

Avatar
Jean-Marc Bourguet
Guillaume GOURDIN writes:

Bonjour à tous, j'ai encore une petite question. Voilà, j'ai le code
suivant:

std::string str_value;
std::stringstream str_strm;

str_strm.str( str_value );
str_strm >> value;

if ( str_strm.fail() == true )
{
return ( false );
}

avec 'str_value' qui vaut par ex. "0x55". A la fin de l'éxecution de ce
code, 'value' vaut 0, et je tombe pas sur le 'return ( false )'. Qu'ai-je
raté?

Merci pour votre aide précieuse.


Deux choses:

- la conversion n'echouera que s'il n'y a pas un prefixe valable, ici 0 est
un prefixe valable donc la conversion n'a pas echoue.

- le format depend du basefield. Normalement c'est decimal. Si tu veux le
mettre a non specifie:

str_strm.unsetf(std::ios_base::basefield)

et si tu veux forcer l'hexa

avant la conversion (et ton resultat sera alors 85).

str_strm.setf(std::ios_base::hex, std::ios_base::basefield);

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Sylvain Togni

std::string str_value;
std::stringstream str_strm;

str_strm.str( str_value );
str_strm >> value;

if ( str_strm.fail() == true )


Drôle de façon d'écrire
if ( !str_strm )
;-)

{
return ( false );
}

avec 'str_value' qui vaut par ex. "0x55". A la fin de l'éxecution de ce
code, 'value' vaut 0, et je tombe pas sur le 'return ( false )'.
Qu'ai-je raté?


D'indiquer au flux que tu souhaite extraire une valeur
hexadécimale:
str_strm >> std::hex >> value;

--
Sylvain Togni

Avatar
Guillaume GOURDIN
str_strm >> value;
if ( str_strm.fail() == true )


Drôle de façon d'écrire
if ( !str_strm )
;-)


Ah bon? Ca marche ça? Quelle est lé méanique impliquée derrière? Les
isstream ont un opérateur de conversion vers les booléens?

avec 'str_value' qui vaut par ex. "0x55". A la fin de l'éxecution de
ce code, 'value' vaut 0, et je tombe pas sur le 'return ( false )'.
Qu'ai-je raté?


D'indiquer au flux que tu souhaite extraire une valeur
hexadécimale:
str_strm >> std::hex >> value;


Je ne suis pas sûr que ça suffise. Il me semble avoir essayé, et le
stream voit le premier '0' de "0x55" et la valeur retournée est zéro a
la place de 0x55. Comme indiqué par Jean-Marc, il semble qu'il faille
écrire:

str_strm.setf( std::ios::hex, std::ios::basefield );

ce qui est un peu obscur pour moi d'ailleurs, pourquoi

str_strm.setf( std::ios::hex );

ne suffit pas?


Avatar
Michael DOUBEZ

std::string str_value;
std::stringstream str_strm;
str_strm.str( str_value );
str_strm >> value;
if ( str_strm.fail() == true )


Drôle de façon d'écrire
if ( !str_strm )
;-)


En fait je préfère sa façon, c'est plus lisible: je n'ai pas à réfléchir
à ce qui est testé mais je ne mets pas en général le '== true'.
if ( str_strm.fail() )
{ ...

Sinon il m'arrive de faire:
if ( str_strm >> value )
{ ...

Qui signifie si lecture dans la stream vers value réussit alors ...

Michael


Avatar
James Kanze
On Jan 18, 1:52 pm, Guillaume GOURDIN wrote:
str_strm >> value;
if ( str_strm.fail() == true )


Drôle de façon d'écrire
if ( !str_strm )
;-)


Ah bon? Ca marche ça? Quelle est lé méanique impliquée
derrière? Les isstream ont un opérateur de conversion vers les
booléens?


Il y a une conversion vers void*, et un surcharge de l'opérateur
!. Et c'est effectivement la convension quasiment universelle de
s'en servir: "if ( str_strm.fail() )" va bien, mais que penser
de "if ( str_strm.good() )" -- les noms des fonctions d'état
sont trop déconcertants.

avec 'str_value' qui vaut par ex. "0x55". A la fin de l'éxecution de
ce code, 'value' vaut 0, et je tombe pas sur le 'return ( false )'.
Qu'ai-je raté?


D'indiquer au flux que tu souhaite extraire une valeur
hexadécimale:
str_strm >> std::hex >> value;


Je ne suis pas sûr que ça suffise. Il me semble avoir essayé, et le
stream voit le premier '0' de "0x55" et la valeur retournée est zéro a
la place de 0x55. Comme indiqué par Jean-Marc, il semble qu'il faille
écrire:

str_strm.setf( std::ios::hex, std::ios::basefield );

ce qui est un peu obscur pour moi d'ailleurs, pourquoi

str_strm.setf( std::ios::hex );

ne suffit pas?


D'abord, "str_strm >> std::hex" fait exactement :
str_strm.setf( std::ios::hex, std::ios::basefield );
Et il faut bien la forme à deux paramètres, parce que
std::ios::hex n'est pas un seul bit, mais une valeur d'un
champs ; le deuxième paramètre spécifie le champs à remettre à
zéro avant d'y mettre le premier paramètre.

Mais en fait, ce que tu veux, peut-être, est plutôt :
str_strm.setf( std::ios::fmtflags(), std::ios::basefield ) ;
pour mettre le champs à zéro. Ce qui veut dire que l'opérateur
va déterminer la base comme fait le compilateur C++, en
utilisant 16 si le nombre commence par "0x" ou "0X", autrement 8
si le nombre commence par "0", et sinon 10.

--
James Kanze (GABI Software) email:
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



Avatar
Jean-Marc Bourguet
Guillaume GOURDIN writes:

str_strm >> value;
if ( str_strm.fail() == true )
Drôle de façon d'écrire

if ( !str_strm )
;-)


Ah bon? Ca marche ça? Quelle est lé méanique impliquée derrière? Les
isstream ont un opérateur de conversion vers les booléens?


vers void* si j'ai bonne memoire (la conversion implicite vers bool ouvre
trop de possibilite; le truc le plus au point semble de convertir vers un
pointeur sur fonction membre d'une classe non visible).

avec 'str_value' qui vaut par ex. "0x55". A la fin de l'éxecution de ce
code, 'value' vaut 0, et je tombe pas sur le 'return ( false
)'. Qu'ai-je raté?
D'indiquer au flux que tu souhaite extraire une valeur

hexadécimale:
str_strm >> std::hex >> value;


Je ne suis pas sûr que ça suffise. Il me semble avoir essayé, et le stream
voit le premier '0' de "0x55" et la valeur retournée est zéro a la place de
0x55. Comme indiqué par Jean-Marc, il semble qu'il faille écrire:

str_strm.setf( std::ios::hex, std::ios::basefield );


A priori, je ne vois pas de difference entre les deux.

ce qui est un peu obscur pour moi d'ailleurs, pourquoi

str_strm.setf( std::ios::hex );

ne suffit pas?


Parce que le change basefield a plusieurs bits et qu'il est possible qu'il
faille remettre certains a 0, ce que ne fait pas ta suggestion.

Tu devrais aussi pouvoir faire:

str_strm >> std::setbase(0)
str_strm >> set::setbase(16)

apres avoir inclus <iomanip>

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org