Re: Probleme avec istringstream
Michael DOUBEZ a écrit :
> James Kanze a écrit :
>> 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.
>
> Je ne comprends pas le problème dans ce cas là:
> - si il était déjà à la fin, il positionne failbit et le get suivant
> retourne bien EOF. Donc, la stream ne contenait bien que l'entier
> - si il n'était pas à la fin, après cela, si la stream est épuisée,
> alors get() va de toutes façon positionner failbit.
Oups, désolé.
J'ai compris: j'avais pas réalisé qu'il y avait une lecture formatée
dans la logique du if().
Est ce qu'il n'est pas possible alors de faire une logique du type suivant ?
if ( (iss >> std::hex >> tmp) //test formatted input
&& (skipws(iss).get() == EOF) //test unformated input is EOF
)
{
//c'est bon
}
Michael
|