115 votes

Comment réutiliser un ostrstream ?

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 ?

151voto

Johannes Schaub - litb Points 256113

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.

5voto

Diego Sevilla Points 17274

Semble être que le `` appel fait le tour.

2voto

Unkle George Points 46

Si vous allez pour effacer la mémoire tampon d’une manière qui entraîne son effacement avant sa première utilisation, vous aurez besoin d’ajouter quelque chose dans la mémoire tampon d’abord w / MSVC.

0voto

Vous n’avez pas. Différemment, utilisez les deux flux nommés par souci de clarté et laissez le compilateur d’optimisation à comprendre qu’il peut réutiliser le vieux un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X