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é?
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).
-- 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
Guillaume GOURDIN <gourdin@liw.fr> writes:
Bonjour à tous, j'ai encore une petite question. Voilà, j'ai le code
suivant:
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).
--
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
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).
-- 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
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;
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;
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
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:
ce qui est un peu obscur pour moi d'ailleurs, pourquoi
str_strm.setf( std::ios::hex );
ne suffit pas?
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:
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:
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 ...
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 ...
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
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:
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
On Jan 18, 1:52 pm, Guillaume GOURDIN <gour...@liw.fr> 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:
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: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
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:
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
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:
-- 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
Guillaume GOURDIN <gourdin@liw.fr> 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:
--
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
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:
-- 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