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

Savez vous pourquoi?

2 réponses
Avatar
heptaedron
Bonjour mesdames et messieurs,

Je suis un (faux) debutant en C++ et je me demande comment le code qui
suit marche..

#include <sstream>

void toto(const string& s)
{
istringstream ist(s);
string w;
while (ist>>w) cout <<w<<'\n';
}

int main()
{
toto(" aa bbbb eeeee eretr a rrr");
}

cela donne en sortie
aa
bbbb
eeeee
eretr
a
rrr
L'operateur >> a ete surcharge je suppose ....

Ne perdez pas tropde temps la dessus mais , si vous le pouvez, donnez moi qq
indications.

Merci d'avance à la communauté

2 réponses

Avatar
ALB
On 6 fév, 08:16, "heptaedron" wrote:
Bonjour mesdames et messieurs,

Je suis  un (faux) debutant en C++ et je me  demande comment le code q ui
suit marche..

#include <sstream>

void toto(const string& s)
{
istringstream ist(s);
string w;
while (ist>>w) cout <<w<<'n';

}

int main()
{
toto(" aa bbbb eeeee eretr a rrr");

}

cela donne en sortie
aa
bbbb
eeeee
eretr
a
rrr
L'operateur >> a ete surcharge je suppose ....

Ne perdez pas tropde temps la dessus mais , si vous le pouvez, donnez moi qq
indications.

Merci d'avance à la communauté


L'opérateur >> n'a pas été surchargé mais l'espace est considéré comme
un séparateur... ce qui veut dire que la string w ne peut pas contenir
d'espace.
ist>>w renvoie le ist modifié.
ist est valide tant que l'opération ist>>w se déroule bien.
Un flux valide est évalué à true, lorsqu'il est considéré comme un
booléen.
En résumé, tant qu'on réussit à récupérer un mot, on l'affiche.

Adrien Le Batteux

Avatar
James Kanze
On Feb 6, 8:16 am, "heptaedron" wrote:
Bonjour mesdames et messieurs,

Je suis un (faux) debutant en C++ et je me demande comment
le code qui suit marche..

#include <sstream>

void toto(const string& s)
{
istringstream ist(s);
string w;
while (ist>>w) cout <<w<<'n';
}

int main()
{
toto(" aa bbbb eeeee eretr a rrr");
}

cela donne en sortie
aa
bbbb
eeeee
eretr
a
rrr
L'operateur >> a ete surcharge je suppose ....


Tout à fait. L'idiome standard des entrées/sorties formattées en
C++, c'est le surcharge des opérateurs >> (pour les entrées) et
<< (pour les sorties). Les surcharges pour tous les types de
base font partie de la bibliothèque standard, mais tu peux en
ajouter autant que tu veux pour tes types à toi (et en fait,
c'est assez rare dans les applications d'utiliser les surcharges
standard, sauf dans l'implémentation des surcharges pour les
types propre à l'application).

En fait, les surcharges se font avec std::istream& (pour >>) et
std::ostream& (pour <<) comme premier paramètre. Mais puisque
std::istringstream dérive de std::istream, les surcharges
marchent aussi avec lui.

Enfin, la définition de l'entrée formattée d'une chaîne, c'est
un mot, c-à-d une suite de caractères non blanc. Ce n'est pas
toujours utile, mais il fallait bien définir quelque chose, et
il n'y a rien qui conviendrait partout. Il y a aussi une
fonction, std::getline(), qui permet de lire une ligne à la
fois. Mais souvent, on utilisera une classe décorateur pour
effectuer les entrées de chaînes, du genre Line ou
ParsableString ou RecordFields (toujours selon les besoins de
l'application) -- l'opérateur >> sur cette classe pourrait bien
utiliser getline(), si l'unité d'enrégistrement, c'est une
ligne. De même, quand on lit un fichier orienté ligne, il est
assez courant de le lire avec std::getline(), puis de mettre la
ligne dans un std::istringstream pour l'analyser plus en
détail -- ça a l'avantage qu'en cas d'erreur de format, on est
automatiquement resynchronisé pour continuer.

--
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