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.

10 réponses

1 2
Avatar
Loïc Joly
Frédéric Gourul wrote:

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.


[...]

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 ?


flush est la fonction qu'a tout stream pour forcer l'écriture de ce
qu'il a en mémoire, dans le cas d'un stringstream, je ne pense pas qu'il
puisse être utile de l'appeler directement.
clear remet à 0 les erreurs qu'a pu rencontrer le flux.

Comment faire ?


Le plus simple : Créer deux flux différents.


--
Loïc

Avatar
James Kanze
"Frédéric Gourul" writes:

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

Le plus simple, c'est simplement de récréer une nouveau
stringstream, non ? Pourquoi s'emmerder pour rien ?

--
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
Laurent Maestracci
This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
--------------enig0CBD2DDB260352901CE7F1B4
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 8bit

Frédéric Gourul wrote:
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.




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

--------------enig0CBD2DDB260352901CE7F1B4
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org

iD8DBQE/8eMENbFdpfAOrfsRApX2AKCVjXx3fKhHYZuYZfj8neF7wW+2uACeMWgF
RSzL0wu36Y4TLtUeYG508Bs =SiJE
-----END PGP SIGNATURE-----

--------------enig0CBD2DDB260352901CE7F1B4--

Avatar
Frédéric Gourul
"James Kanze" a écrit dans le message de
news:
"Frédéric Gourul" writes:

Le plus simple, c'est simplement de récréer une nouveau
stringstream, non ? Pourquoi s'emmerder pour rien ?


Ben non pas pour rien... évidemment dans l'exemple que je donne, c'est
vraiment pour rien. Mais le stringstream est un membre d'une classe qui
stocke les informations en provenance des flux jusqu'a ce que les
informations soient traitées et un nouveau cycle recommence. Ne connaissant
pas bien les stringstream, je ne savais pas si la réinitialisation était
possible. Allouer et détruire le stringstream à chaque cycle ne
m'aparaissait pas la solution la plus naturelle...

merci de vos réponses.

Avatar
James Kanze
Laurent Maestracci writes:

|> Frédéric Gourul wrote:
|> > 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 ?

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

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

le stringstream est un membre d'une classe qui
stocke les informations en provenance des flux jusqu'a ce que les
informations soient traitées et un nouveau cycle recommence.


Ca fait pas beaucoup d'info, mais vu comme ça, j'aurais tendance à
croire que le stringstream correspond à une chose temporaire et
transitoire. Dans ce cas, je le verrais bien en variable locale d'une
fonction (ou un stringstream local dans chaque fonction qui s'occupe
d'un bout du traitement).

Ne connaissant
pas bien les stringstream, je ne savais pas si la réinitialisation était
possible. Allouer et détruire le stringstream à chaque cycle ne
m'aparaissait pas la solution la plus naturelle...


Du moment qu'on en fait une var membre, ça se comprend. Mais un

teststr = stringstream ();

Ne ferait pas l'affaire ? Je pose la question, en même temps, je me
doute qu'elle est d'une stupidité monstrueuse. Le genre «depuis quand on
affecterait des streams ?» voire «depuis quand on affecterait dans la SL
?»... mais bon, j'ai un peu la flemme de faire trois mètres et d'ouvrir
mon Stroustrup (pas taper).

merci de vos réponses.


Gourgouilloult du Clapotis
Et meilleurs voeux tout le monde ;)

Avatar
Loïc Joly
Gourgouilloult wrote:
Du moment qu'on en fait une var membre, ça se comprend. Mais un

teststr = stringstream ();

Ne ferait pas l'affaire ? Je pose la question, en même temps, je me
doute qu'elle est d'une stupidité monstrueuse. Le genre «depuis quand on
affecterait des streams ?»


Depuis quand on peut affecter des streams ?

--
Loïc

Avatar
James Kanze
"Frédéric Gourul" writes:

|> "James Kanze" a écrit dans le message de
|> news:
|> > "Frédéric Gourul" writes:

|> > Le plus simple, c'est simplement de récréer une nouveau
|> > stringstream, non ? Pourquoi s'emmerder pour rien ?

|> Ben non pas pour rien... évidemment dans l'exemple que je donne,
|> c'est vraiment pour rien. Mais le stringstream est un membre d'une
|> classe qui stocke les informations en provenance des flux jusqu'a ce
|> que les informations soient traitées et un nouveau cycle
|> recommence. Ne connaissant pas bien les stringstream, je ne savais
|> pas si la réinitialisation était possible. Allouer et
|> détruire le stringstream à chaque cycle ne m'aparaissait pas
|> la solution la plus naturelle...

Oui et non. Je comprends la situation, mais ce que tu veux, c'est bien
un nouveau « buffer » à chaque coup. Or, dans la mesure que
stringstream n'a pas de fonction qui permet la réinitialisation
complète, je ne vois pas d'autre solution propre. Dans ce cas-là,
j'utiliserais probablement une construction paresseuse -- l'objet
contiendrait un pointeur à un ostringstream, et les fonctions qui
voulaient l'utiliserait ferait appel à une fonction speciale,
«@getDest@», ou quelque chose du genre, qui ferait :

&std::ostream
MyClass::getDest()
{
if ( myCurrentDest == NULL ) {
myCurrentDest = new std::ostringstream() ;
}
return *myCurrentDest ;
}

Pour le flush :

void
MyClass::flushDest()
{
if ( myCurrentDest != NULL ) {
faitCeQuilFautAvec( myCurrentDest->str() ) ;
delete myCurrentDest ;
myCurrentDest = NULL ;
}
}

Je me démande même si je n'encapsulerais pas cette
fonctionnalité dans une classe à part.

--
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
Fabien LE LEZ
On Thu, 01 Jan 2004 08:49:39 +0100, Loïc Joly
wrote:

Depuis quand on peut affecter des streams ?


class des_streams
{
};

Et hop, le tour est joué !

--
;-)

http://www.gotw.ca/gotw/063.htm
http://www.gotw.ca/gotw/067.htm#2

Avatar
Jorge Rivera
Pur réinitialiser le streambuf dans stringstream, il faut utiliser
stringstream::str(std::string str). Une modification a votre exemple:

{
stringstream teststr;
teststr << "chaine " << 1 << ".";
cout << teststr.str() << endl;

//teststr.flush();
//teststr.clear();

teststr.str("");

teststr << "chaine " << 2 << ".";
cout << teststr.str() << endl;
}

Vous donnera:

chaine 1.
chaine 2.



Cette solution n'est pas exactement de réinitialiser le stringstream,
mais de changer l'objet streambuf et de le donner un string qui ne
contienne rien.

Frédéric Gourul wrote:
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.





1 2