2010-10-01 9 views
13

En MSVC 2005, tengo el siguiente código.¿Cuál es el propósito del constructor de cadenas de ostringstream?

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

Lo que espero es:

initial string 5 

Lo que obtengo es:

5nitial string 

La inicialización de la corriente con una cadena, esperaría que la corriente para mover su posición hasta el final de la cadena inicial. Obviamente, STL no está de acuerdo conmigo (no es la primera vez).

¿Cuál es el propósito de tal comportamiento? ¿Este uso es útil para cualquier cosa? Además, ¿hay alguna forma de avanzar la posición de la secuencia hasta el final de la cadena inicial?

Respuesta

18

El uso de un ostringstream y proporcionando un valor inicial es igual que abrir un archivo existente para la escritura. Tiene algunos datos allí, y a menos que especifique lo contrario, su posición inicial estará al principio de los datos. Puede buscar en los datos, o puede especificar ios::ate para colocar inicialmente el puntero de escritura al final de los datos existentes, o puede especificar ios::app para colocar siempre el puntero de escritura al final de los datos existentes.

+0

Esto tiene sentido. 'ostringstream' se ajusta a otros tipos de flujo y se predetermina al principio hasta que se mueva explícitamente a otro lugar. Gracias. –

+2

Eso es tan obvio ahora que lo explica en relación con los archivos, pero antes siempre pensé que el comportamiento era muy extraño. Mi nuevo y genial hecho del día. –

4

para buscar el final, hacer esto:

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

cuanto a por qué los valores predeterminados de posición de escritura en la parte delantera, no sé.

14

Puede especificar el segundo parámetro (opcional) del constructor para colocar el cursor corriente al final:

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