Je voudrais effacer et réutiliser un ostrstream (et la mémoire tampon sous-jacente) pour que mon application n’a pas à faire autant de dotations. Comment réinitialiser l’objet à son état initial ?
Réponses
Trop de publicités?J'ai utilisé une séquence de claire et de str dans le passé:
// clear, because eof or other bits may be still set.
s.clear();
s.str("");
Qui a fait la chose à la fois d'entrée et de sortie stringstreams. Alternativement, vous pouvez effacer manuellement, puis à rechercher la séquence appropriée afin de le commencer:
s.clear();
s.seekp(0); // for outputs: seek put ptr to start
s.seekg(0); // for inputs: seek get ptr to start
Qui permettra d'éviter certaines réaffectations effectuées par str
en écrasant tout ce qui est dans la mémoire tampon de sortie actuellement à la place. Les résultats sont comme ceci:
std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b";
assert(s.str() == "bello");
Si vous souhaitez utiliser la chaîne pour c-fonctions, vous pouvez utiliser std::ends
, en mettant une valeur null comme ceci:
std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b" << std::ends;
assert(s.str().size() == 5 && std::strlen(s.str().data()) == 1);
std::ends
est un vestige de l'obsolète std::strstream
, ce qui a pu écrire directement à un tableau de char que vous avez alloué sur la pile. Vous avez eu à insérer une valeur null manuellement. Toutefois, std::ends
n'est pas déconseillée, je pense parce que c'est toujours utile dans les cas ci-dessus.