2008-11-27 8 views
37

Actualmente estoy usando std::ofstream de la siguiente manera:contenidos de escritura stringstream en ofstream

std::ofstream outFile; 
outFile.open(output_file); 

Entonces intentan pasar un objeto a std::stringstreamoutFile de la siguiente manera:

GetHolesResults(..., std::ofstream &outFile){ 
    float x = 1234; 
    std::stringstream ss; 
    ss << x << std::endl; 
    outFile << ss; 
} 

Ahora mi outFile contiene nada más que basura: "0012E708" repetido todo.

En GetHolesResults Puedo escribir

outFile << "Foo" << std:endl; 

y es la salida correcta en outFile.

¿Alguna sugerencia sobre lo que estoy haciendo mal?

+1

sugiero reformular el título a algo en la línea de: 'Escritura de contenido stringstream en ofstream' (o ostream para lo que importa) –

+1

Eric, debe marcar la respuesta de Johannes aceptada de modo que pueda eliminar las minas (que es claramente peor que su enfoque) –

+1

Ok, hecho. Pero en los días pasados, utilicé su solución =) – Eric

Respuesta

67

Puede hacer esto, que no necesita crear la cadena. Hace que la secuencia de salida lea los contenidos de la secuencia en el lado derecho (utilizable con cualquier transmisión).

outFile << ss.rdbuf(); 
+5

Tengo curiosidad: ¿por qué esta solución funciona con 'std :: stringstream' pero no con' std :: ostringstream'? En el segundo caso, recibo un archivo vacío. –

+3

@JaviV porque puede [solo escribir] (http://en.cppreference.com/w/cpp/io/basic_ostream) en 'std :: oANYSTREAM' y solo lee de' std :: iANYSTREAM'. No tendrá sentido para 'output_stream' si también tiene operaciones' read'. Si necesita ambos simplemente use 'std :: ANYSTREAM' y está en casa :) –

3

Al pasar una cadena de caracteres rdbuf a una secuencia, las líneas nuevas no se traducen. El texto de entrada puede contener \n por lo que encontrar reemplazar no funcionará. El código anterior escribió en un flujo de datos y al cambiarlo a un flujo de cadena pierde la traducción endl.

+2

Esto debería ser un comentario, no una respuesta, porque no le ha explicado cómo escribir un std :: stringstream a std :: ofstream – bitek

8

Si está usando std::ostringstream y se pregunta por qué no se escribe nada con ss.rdbuf(), utilice la función .str().

outFile << oStream.str(); 
+4

su respuesta me llevó a la siguiente realización: para obtener una matriz 'char' de' ss', puede hacer 'ss.str(). c_str()'. (acaba de publicar aquí para el beneficio de los novatos que tropiezan con esto en el futuro). – dbliss

+1

@Digital_Reality, gracias! nada se estaba escribiendo cuando usé rdbuff. ¿Cuál es la razón para esto? – Nasir