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 ? Comment faire ?
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
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.
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
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
"Frédéric Gourul" <fgourul@9online.fr> 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:kanze@gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|> 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
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.
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("");
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.
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("");
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.
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("");
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.
"James Kanze" <kanze@alex.gabi-soft.fr> a écrit dans le message de
news:86y8su2k0y.fsf@alex.gabi-soft.fr...
"Frédéric Gourul" <fgourul@9online.fr> 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...
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.
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
|> 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:kanze@gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|> 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
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 ;)
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 ;)
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 ;)
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
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 ?»
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
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 ; }
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
"Frédéric Gourul" <fgourul@9online.fr> writes:
|> "James Kanze" <kanze@alex.gabi-soft.fr> a écrit dans le message de
|> news:86y8su2k0y.fsf@alex.gabi-soft.fr...
|> > "Frédéric Gourul" <fgourul@9online.fr> 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 ;
}
Je me démande même si je n'encapsulerais pas cette
fonctionnalité dans une classe à part.
--
James Kanze mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|> "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 ; }
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
Fabien LE LEZ
On Thu, 01 Jan 2004 08:49:39 +0100, Loïc Joly wrote:
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.
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.
Pur réinitialiser le streambuf dans stringstream, il faut utiliser
stringstream::str(std::string str). Une modification a votre exemple:
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.
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 ?
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.
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 ?