Flux : stringstream, à quoi sert le flush()

Flux : stringstream, à quoi sert le flush() - C++ - Programmation

Marsh Posté le 01-12-2003 à 10:42:30    

Salut,
J'utilise dans mon application un ostringstream, et j'ai pas mal de questions à ce sujet :
tout d'abord on écrit dans le flux via l'opérateur << et je récupère le tout sous forme de string via la méthode str().
Seulement j'aimerais bien "vider" le flux de temps en temps, explication :

Code :
  1. ostringstream oss;
  2. oss << "toto" << 2;
  3. cout << oss.str() << "\n"; //oss.str() contient "toto 2", ok
  4. //ici je voudrais vider le flux
  5. oss << "ta" << 3;
  6. cout << oss.str() << "\n"; //oss.str() contient "toto 2ta 3"


 
et j'aimerais bien pouvoir récupérer seulement "ta 3", donc comment faire ?
La solution que j'ai trouvé, dites moi si ça va pas :

Code :
  1. ostringstream oss;
  2. oss << "toto" << 2 << ends;
  3. cout << oss.str() << "\n";
  4. //...
  5. oss << "ta" << 3 << ends;
  6. cout << oss.str().c_str() << "\n"; //affiche bien ce que je veux "ta 3"


je passe donc par la méthode c_str() de la classe string qui va donc s'arrêter au premier caractère nul rencontré. C'est tout ce que j'ai trouvé...
Biensur mon but n'est pas simplement d'afficher "ta 3" comme dans l'exemple, mais ensuite de travailler avec cette chaine.
 
Sinon autre question, toujours dans l'optique de "vider" le flux, je me suis penché sur la méthode flush() et je n'ai absolument pas compris à quoi elle sert...
merci
   ANT


Message édité par antsite le 01-12-2003 à 10:44:06
Reply

Marsh Posté le 01-12-2003 à 10:42:30   

Reply

Marsh Posté le 01-12-2003 à 11:42:19    

flush ne vide rien et ne sert à rien sur un stringstream, c'est juste là à cause de l'héritage. ends est également inutile dans ton cas, puis que str().c_str() est une chaîne terminée par un zéro.
"\n" -> '\n'.
sinon pour ta question, je ne connais pas de solution, d'ailleurs je ne pense pas que cela ait un sens. à défaut, tu peux faire avec une allocation dynamique, tu la planque dans un std::auto_ptr ou boost::shared_ptr
 
ta solution marche par ce qu'une std::string peut contenir des 0 sans problème. en fait, c_str != [data, size] donc en foutant un 0 et en passant par c_str, ça tronque
 

Code :
  1. #include <sstream>
  2. #include <iostream>
  3. #include <memory>
  4. int main()
  5. {
  6.   std::auto_ptr<std::ostringstream> oss(new std::ostringstream);
  7.   *oss << 1 << std::hex << 42 << "911" << '\n';
  8.  
  9.   std::cout << oss->str();
  10.   oss.reset(new std::ostringstream);
  11.   *oss << "dawa" << 3;
  12.   std::cout << oss->str();
  13. }


 
je ferais comme ça, tu as le même nom de variable. je me suis jamais vraiment posé la question en fait...

Reply

Marsh Posté le 01-12-2003 à 13:30:21    

tu peux faire : oss.str("" );


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 01-12-2003 à 13:43:31    

pas pour un ostringstream, sinon c'est effectivement une bonne solution

Reply

Marsh Posté le 01-12-2003 à 16:39:14    

Taz a écrit :

pas pour un ostringstream, sinon c'est effectivement une bonne solution


pourquoi pas pour un ostringstream?

Reply

Marsh Posté le 01-12-2003 à 17:04:24    

ah ouais tiens t'as raison, je savais pas que str étais surchargée ... intéressant. jamais eu besoin, mais bon. je retire mes commentaires et ma solution (l'exemple de auto_ptr servira quand même peut être)

Reply

Marsh Posté le 01-12-2003 à 17:26:44    

merci je vais tester ça (je pensais qu'ostringstream n'avait la méthode str qu'en tant qu'accesseur)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed