OVH Cloud OVH Cloud

reinitialisation des stringstream ?

15 réponses
Avatar
Frédéric Gourul
Bonjour,

J'ai un peu de mal avec l'utilisation des stringstream, je cherche à
reinitialiser un stringstream, dans le sens où je veux vider le tampon,
qu'il ne contienne plus rien, comme lors de sa création.

exemple:
stringstream teststr;
teststr << "chaine " << 1 << ".";
cout << teststr.str() << endl;
teststr.flush();
teststr.clear();
teststr << "chaine " << 2 << ".";
cout << teststr.str() << endl;

j'obtiens:
chaine 1.
chaine 1.chaine 2.

je pensais que soit clear() soit flush() me débarrasserait du "chaine 1."
que je retrouve dans le deuxième appel à str().
A quoi servent-ils alors ? Comment faire ?

merci.

5 réponses

1 2
Avatar
James Kanze
Jorge Rivera writes:

|> Pur réinitialiser le streambuf dans stringstream, il faut
|> utiliser stringstream::str(std::string str).

Ce qui ne réinitialise pas le stringstream. Du tout. Il ne
réinitialise que le buffer, mais stringstream a beaucoup plus de
contexte que ça.

Dans le cas général, une réinitialisation est impossible, parce
qu'on n'a aucun moyen de savoir toute la contexte.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
Samuel Krempp
le Wednesday 31 December 2003 12:03, écrivit :

|> soit tu recrées un stringstream, soit tu le réinitialises comme ceci :
|> teststr.str("");

Ce qui ne le réinitialise que partiellement. Il faudrait aussi
remettre à zéro une erreur éventuelle (voire le eofbit),
remettre les flags de formattage à leur état initial, etc.


en fait ça fait juste la partie de réinitialisation dont on voudrait se
passer : désallouer et réallouer le buffer interne, alors que ça garde ce
qu'on voudrait peut être éviter : les options de formatage.

dong en gros aucun interêt à appeler str("") ..

si on veut juste repositionner les pointeurs du buffer sans rien re-allouer,
il faut faire son propre streambuffer (et le mettre dans son propre
stream). En dérivant std::stringbuf en gros parasite ça prend juste une
30aine de lignes de code.. (d'ailleurs j'ai posté un code pour ça ya qques
mois. en cherchant sur google groups avec 'stringstream' dans le sujet ça
devrait sortir)


vraiment je les trouve mal fagotés ces stringstream. Ils réussissent à être
à la fois confus d'utilisation, et dépourvus de toute flexibilité..
et leur spécification dans la norme est completement tordue.
--
Sam

Avatar
Gabriel Dos Reis
you know who to blame :-)
Avatar
Samuel Krempp
le Wednesday 07 January 2004 05:26, écrivit :
you know who to blame :-)


ben en fait pas vraiment, je suis pas très calé en histoire du C++..

--
Sam

Avatar
Gabriel Dos Reis
ah mais, c'est pas les griots qui manquent ici ;-p

-- Gaby
1 2