2010-10-01 6 views
13

Auf MSVC 2005 habe ich den folgenden Code.Was ist der Zweck des String-Konstruktors von ostringstream?

std::ostringstream stream("initial string "); 
stream << 5; 
std::cout << stream.str(); 

Was ich erwarte, ist:

initial string 5 

Was ich erhalte, ist:

5nitial string 

Initialisieren der Strom mit einer Schnur, würde ich den Strom erwarten seine Position bis zum Ende bewegen der ursprünglichen Zeichenfolge. Offensichtlich stimmt STL nicht mit mir überein (nicht das erste Mal).

Was ist der Zweck eines solchen Verhaltens? Ist dieser Anwendungsfall für irgendetwas nützlich? Gibt es auch eine Möglichkeit, die Stream-Position bis zum Ende der ursprünglichen Zeichenfolge vorzuziehen?

Antwort

18

ein ostringstream Verwendung und einen Ausgangswert bereitstellt, wie eine vorhandene Datei zum Schreiben geöffnet wird. Sie haben dort einige Daten, und wenn Sie nichts anderes angeben, befindet sich Ihre Ausgangsposition am Anfang der Daten. Sie können in den Daten suchen oder ios::ate angeben, um den Schreibzeiger zunächst an das Ende der vorhandenen Daten zu positionieren, oder Sie können ios::app angeben, um den Schreibzeiger immer an das Ende der vorhandenen Daten zu positionieren.

+0

Dies ist sinnvoll. 'ostringstream' stimmt mit anderen Stream-Typen überein und beginnt mit dem Beginn, bis es explizit anderswo verschoben wird. Vielen Dank. –

+2

Das ist jetzt so offensichtlich, dass du es in Bezug auf Dateien erklärst, aber vorher war ich immer sehr merkwürdig. Meine neue coole Tatsache des Tages. –

4

bis zum Ende zu suchen, dies zu tun:

stream.seekp(0, ios_base::end); 

, warum die Schreibposition standardmäßig auf die Vorderseite, ich weiß es nicht.

14

Sie können die zweiten (optional) Parameter des Konstruktors geben den Strom Cursor am Ende zu setzen:

std::ostringstream stream("initial string ", std::ios::ate);