Comprendre les std::istringstream

Le problème exposé dans ce sujet a été résolu.

Bonjour,

J’ai le code suivant en C++ :

#include <iostream>
#include <sstream>

int main()
{
    std::istringstream flux_entree{ "f8 ad 32" };

    int rouge{ 0 };
    int vert{ 0 };
    int bleu{ 0 };

    std::cout << flux_entree.get() << std::endl;
    flux_entree >> std::hex >> rouge >> vert >> bleu;
    std::cout << "Niveau de rouge : " << rouge << std::endl;
    std::cout << "Niveau de vert : " << vert << std::endl;
    std::cout << "Niveau de bleu : " << bleu << std::endl;

    return 0;
}

Et voici ce que ça m’affiche :

102
Niveau de rouge : 8
Niveau de vert : 173
Niveau de bleu : 50

J’ai plusieurs questions :

  • Pourquoi flux_entree.get() me retourne 102 ? Je n’ai pas 102 dans ma string, que ce soit en décimal ou hexadécimal (66). Il me semblait que get()me retournait le premier caractère du flux, je m’attendais à avoir f s’afficher à l’écran…
  • En supprimant la ligne std::cout << flux_entree.get() << std::endl; j’obtiens le résultat suivant :
Niveau de rouge : 248
Niveau de vert : 173
Niveau de bleu : 50

Le caractère espace est le séparateur de données pour un flux ?

Merci pour vos réponses !

Salut @Wizix.

En fait, pour bien comprendre, il faut savoir que la fonction get ne retourne pas vraiment un caractère mais un entier. Ceci est un héritage de l’époque du C, où un caractère était de type int.

Comme tu transmets un entier, std::cout affiche la valeur entière de f. Si par contre tu utilises une variable char, tu verra bien à l’écran f.

Également, get mange un caractère du flux, voilà pourquoi tes résultats sont différents avec ou sans.

Enfin, oui, l’espace est un séparateur, comme pour std::cin.

Voilà, si tu as d’autres questions n’hésite pas. :)

En fait, pour bien comprendre, il faut savoir que la fonction get ne retourne pas vraiment un caractère mais un entier. Ceci est un héritage de l’époque du C, où un caractère était de type int.

Héhé j’aurais du vérifier ça, merci ! :D

Enfin, oui, l’espace est un séparateur, comme pour std::cin.

Justement voilà une autre question. J’ai le code suivant :

#include <iostream>
#include <sstream>

int main()
{
    std::ostringstream flux_sortie;

    flux_sortie << "Paul" << "Pierre";
    flux_sortie << "Jean";

    std::cout << "Flux sortie : " << flux_sortie.str() << std::endl;

    return 0;
}

Et ça m’affiche :

Flux sortie : PaulPierreJean

On avait pas dit que l’espace est un séparateur ? C’est à moi de séparer mes données avec un espace manuellement ?

Autre question, si je rajoute le code suivant (qui ne compile pas) :

std::string paul;
std::string pierre;
std::string jean;

flux_sortie >> paul >> pierre >> jean;

std::cout << paul << std::endl;

L’opérande >> n’est pas définie pour la classe std::ostringstream. Que suis-je sensé faire pour sortir les données de mon flux comme j’ai appris avec un std::istringstream ?

Merci encore !

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte