Je ne comprends pas la fonction str() dans ce cas :

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

Bonsoir,

Mon problème

Sur le cours de C++ du site (très bien fait), je ne comprends pas une ligne dans le corrigé proposé :

    flux.str(std::string {});

(Le lien de la ligne ici)

J’avais bien compris (un peu avant dans le code) qu’en écrivant std::string nom_morceau flux.str(), on affecte à la chaîne de caractères nom_morceau une chaîne contenant le « flux ». Mais je ne suis pas encore à l’aise avec les flux, et je ne comprends vraiment pas ce que fait l’instruction tout au-dessus.

Édit

Je pense avoir un peu compris l’utilité : cela permet de vider le flux, de le réinitialiser en quelque sorte. Mais j’ai un peu de mal encore à comprendre la logique du truc : le fait de le "considérer/convertir en/rendre en" string pour le réinitialiser. Je trouve les opérateurs << et >> très très spéciaux. Pour moi << c’est un peu de la concaténation de flux. Mais j’ignore ce que l’on concatène lorsque qu’on écrit std::cout << "blabla"… Pour affecter une valeur à un flux, on utilise par exemple std::cin mais comment l’initialiser sinon ? Lorsqu’il s’agit d’un flux de chaînes, peut-on lui affecter une valeur lorsqu’on l’initialise avec std::ostringstream flux ? J’avais déjà très peu compris la ligne suivante :

    flux_chaine << std::scientific << std::showpos << reel << std::endl;

dans le chapitre-ci.

Bon, je vais relire le cours sur les flux pour essayer d’éclairer mes pensées.

J’espère y voir plus clair après vos réponses :) . Bonne soirée !

+0 -0

Salut,

La ligne que tu cites réinitialises en effet la chaîne qui constitue l’état de flux. Cf. variants (4) et (6) de https://en.cppreference.com/w/cpp/io/basic_stringstream/str.

Les flux sont l’abstraction choisie par la bibliothèque C++ pour abstraire les objets qui peuvent consommer ou produire du texte, comme l’entrée et la sortie standard du programme.

<< représente la modification de l’état du flux par consommation d’une chaîne de caractère — ou d’un objet convertible en chaîne, ou d’un modificateur. Dans le cas de cout, l’état du flux est juste ce qui est envoyé sur la sortie standard du processus. Dans le cas d’un ostringstream comme flux, l’état interne est une chaîne. Ça peut paraître un détour bizarre de passer par un flux pour modifier une chaîne, mais ça permet d’utiliser la même interface pratique que pour les autres types de flux, avec la conversion automatique des entiers en string, les modificateurs comme std::scientific ou std::showpos, etc.

Le corrigé du tuto crée un ostringstream, puis répète plusieurs fois le même processus :

  1. Créer une chaîne formatée en « envoyant des trucs dans le flux » avec <<
  2. Récupérer la chaîne avec flux.str() (sans argument)
  3. Remplacer l’état du flux par une chaîne vide avec flux.str( std::string{} ).

On aurait pu obtenir le même résultat en utilisant plusieurs ostringstreams différents, dans ce cas pas besoin de réinitialiser leur état.

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