Je voudrais effacer et réutiliser un ostringstream (et le tampon sous-jacent) afin que mon application n'ait pas à faire autant d'allocations. Comment réinitialiser l'objet à son état initial?
117
Je voudrais effacer et réutiliser un ostringstream (et le tampon sous-jacent) afin que mon application n'ait pas à faire autant d'allocations. Comment réinitialiser l'objet à son état initial?
Réponses:
J'ai utilisé une séquence de clear et str dans le passé:
Ce qui a fait la chose pour les flux de chaînes d'entrée et de sortie. Vous pouvez également effacer manuellement, puis rechercher la séquence appropriée pour commencer:
Cela empêchera certaines réallocations effectuées en
str
écrasant ce qui se trouve actuellement dans le tampon de sortie. Les résultats sont comme ceci:Si vous souhaitez utiliser la chaîne pour les fonctions c, vous pouvez utiliser
std::ends
, en mettant un null de fin comme ceci:std::ends
est une relique de la version obsolètestd::strstream
, qui était capable d'écrire directement dans un tableau de caractères que vous avez alloué sur la pile. Vous deviez insérer un null de fin manuellement. Cependant,std::ends
n'est pas obsolète, je pense parce que c'est toujours utile comme dans les cas ci-dessus.la source
s.str("");
place.auto str = s.str(); auto cstr = str.c_str(); file << cstr; s.clear(); s.seekp(0); s << ends;
boost::any a = 1; std::ostringstream buffer; buffer << a << std::ends; EXPECT_EQ( buffer.str(), "any<(int)1>" );
TestUtilsTest.cpp:27: Failure Expected: buffer.str() Which is: "any<(int)1>\0" To be equal to: "any<(int)1>"
et si je réutilise avec des chaînes de longueur différente, il me reste des bitss.seekp(0); s << std::ends; s.seekp(0);
Il semble que l'
ostr.str("")
appel fasse l'affaire.la source
Si vous voulez effacer le tampon d'une manière qui le fera effacer avant sa première utilisation, vous devrez d'abord ajouter quelque chose au tampon avec MSVC.
la source
clear
sera provoquer l'failbit
être ensemble si le flux est vide. Alors que juste appelerseekp
devrait simplement retourner si aucun flux n'existe.Vous ne le faites pas. Utilisez deux flux nommés différemment pour plus de clarté et laissez le compilateur d'optimisation comprendre qu'il peut réutiliser l'ancien.
la source
ostringstream
(basé sur les données lues) et doit ensuite écrire la chaîne construiteostringstream
quelque part de temps en temps (par exemple après qu'une certaine séquence de caractères a été lue) et commencer construire une nouvelle chaîne.