Question

J'aimerais effacer et réutiliser un ostringstream (et le tampon sous-jacent) afin que mon application n'ait pas à effectuer autant d'allocations. Comment réinitialiser l'objet à son état initial?

Était-ce utile?

La solution

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("");

Qui a fait la chose pour les chaînes de caractères d'entrée et de sortie. Vous pouvez également effacer manuellement, puis rechercher la séquence appropriée au début:

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éaffectations effectuées par str en é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 plaçant un caractère final 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 relict du obsolète std :: strstream , qui a pu écrire directement dans un tableau de caractères que vous avez alloué sur la pile. Vous deviez insérer un null final manuellement. Cependant, std :: ends n'est pas obsolète, je pense parce que cela reste utile comme dans les cas précédents.

Autres conseils

Il semble que l'appel ostr.str ("") fasse l'affaire.

Si vous voulez effacer le tampon de manière à ce qu'il soit effacé avant sa première utilisation, vous devez d'abord ajouter quelque chose au tampon avec w / 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
    }
};

Vous n'avez pas. Utilisez deux flux nommés différemment pour plus de clarté et laissez le compilateur optimiseur déterminer qu'il peut réutiliser l'ancien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top