Réponses:
J'ai utilisé une séquence de clear et str dans le passé:
// clear, because eof or other bits may be still set.
s.clear();
s.str("");
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:
s.clear();
s.seekp(0); // for outputs: seek put ptr to start
s.seekg(0); // for inputs: seek get ptr to start
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:
std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b";
assert(s.str() == "bello");
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::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 une relique de la version obsolète std::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.
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 bits
s.seekp(0); s << std::ends; s.seekp(0);
Il semble que l' ostr.str("")
appel fasse l'affaire.
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.
struct Foo {
std::ostringstream d_str;
Foo() {
d_str << std::ends; // Add this
}
void StrFunc(const char *);
template<class T>
inline void StrIt(const T &value) {
d_str.clear();
d_str.seekp(0); // Or else you'll get an error with this seek
d_str << value << std::ends;
StrFunc(d_str.str().c_str()); // And your string will be empty
}
};
clear
sera provoquer l' failbit
être ensemble si le flux est vide. Alors que juste appeler seekp
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.
ostringstream
(basé sur les données lues) et doit ensuite écrire la chaîne construite ostringstream
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.