2010-10-01 7 views
13

Su MSVC 2005, ho il seguente codice.Qual è lo scopo del costruttore di string di ostringstream?

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

Quello che mi aspetto è:

initial string 5 

Quello che ottengo è:

5nitial string 

inizializzazione del torrente con una corda, mi aspetterei il flusso di spostare la sua posizione fino alla fine della stringa iniziale. Ovviamente, STL non è d'accordo con me (non è la prima volta).

Qual è lo scopo di tale comportamento? Questo caso d'uso è utile per qualcosa? Inoltre, c'è un modo per far avanzare la posizione del flusso fino alla fine della stringa iniziale?

risposta

18

Utilizzando un ostringstream e fornendo un valore iniziale è come aprire un file esistente per la scrittura. Hai alcuni dati lì, e se non specifichi diversamente, la tua posizione iniziale sarà all'inizio dei dati. È possibile cercare i dati oppure specificare ios::ate per posizionare inizialmente il puntatore di scrittura alla fine dei dati esistenti oppure è possibile specificare ios::app per posizionare sempre il puntatore di scrittura alla fine dei dati esistenti.

+0

Questo ha senso. 'ostringstream' si conforma agli altri tipi di flusso e alle impostazioni predefinite all'inizio finché non viene spostato esplicitamente altrove. Grazie. –

+2

Questo è così ovvio ora che lo spieghi in relazione ai file, ma prima ho sempre pensato che il comportamento fosse molto strano. Il mio nuovo fatto interessante del giorno. –

4

a cercare fino alla fine, fare questo:

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

Per quanto riguarda il motivo per cui le impostazioni predefinite posizione di scrittura per la parte anteriore, non so.

14

È possibile specificare il secondo parametro (opzionale) del costruttore per posizionare il cursore flusso al termine:

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