Frage

Ich mag ein Ostringstream löschen und wiederverwendet wird (und den zugrunde liegenden Puffer), so dass mein App nicht so viele Zuweisungen zu tun hat. Wie setze ich das Objekt in seinen Ausgangszustand?

War es hilfreich?

Lösung

Ich habe eine Reihe von klaren und str in der Vergangenheit verwendet:

// clear, because eof or other bits may be still set. 
s.clear();
s.str("");

Was hat das getan für Eingang und Ausgang stringstreams. Alternativ können Sie manuell löschen, suchen Sie dann die entsprechende Sequenz die beginnen:

s.clear();
s.seekp(0); // for outputs: seek put ptr to start
s.seekg(0); // for inputs: seek get ptr to start

Das wird einige Umschichtungen von str getan verhindert durch Überschreiben, was in dem Ausgabepuffer ist zur Zeit statt. Die Ergebnisse sind wie folgt:

std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b";
assert(s.str() == "bello");

Wenn Sie die Zeichenfolge für c-Funktionen nutzen möchten, können Sie std::ends verwenden, eine abschließende Null wie folgt setzen:

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 ist ein Relikt aus der veralteten std::strstream, die direkt an ein char-Array schreiben, konnte man auf dem Stack zugeordnet. Sie hatte eine abschließende Null manuell einzufügen. Allerdings std::ends nicht veraltet ist, ich glaube, weil es, wie in den oben genannten Fällen noch nützlich ist.

Andere Tipps

Es scheint zu sein, dass der ostr.str("") Aufruf den Trick funktioniert.

Wenn Sie vorhaben, den Puffer in eine Art und Weise zu löschen, die es bewirkt, dass gelöscht werden, bevor es die erste Gebrauch ist, müssen Sie etwas zu dem Puffer hinzuzufügen ersten 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
    }
};

Sie dies nicht tun. Verwenden Sie zwei unterschiedlich benannte Datenströme für Klarheit und lassen Sie die optimierenden Compiler Figur heraus, dass es die alten wiederverwenden kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top