2010-06-24 17 views
7

Tengo el siguiente código, que se ejecuta en Suse 10.1/G ++ 4.1.0, y no escribe en el archivo:ofstream no descarga

#include <fstream> 
#include <iostream> 

int main(){ 
    std::ofstream file("file.out"); 
    file << "Hello world"; 
} 

El archivo se crea y se abre correctamente, pero esta vacio. Si cambio el código para:

#include <fstream> 
#include <iostream> 

int main(){ 
    std::ofstream file("file.out"); 
    file << "Hello world\n"; 
} 

(añadir un \n al texto), funciona. También probé a enjuagar el flujo de corriente, pero no funcionó.

¿Alguna sugerencia?

+2

¿Cómo se comprueba el archivo resultante? – log0

+1

El programa en Debian/Sid con g ++ 4.4.4 funciona como se esperaba y file.out contiene la cadena (sin nueva línea). Intente actualizar su compilador o sistema operativo: ambos están desactualizados. – Dummy00001

+1

¿Cómo está revisando si el archivo está vacío?Haga esto en el archivo resultante: wc y vea cuál es el resultado. Debe ser 0 2 11. 0 líneas, 2 palabras, 11 caracteres. Sin la nueva línea, la salida "Hola mundo" se ejecutará en su mensaje, por lo que es posible que le falte. –

Respuesta

7

Si comprueba su archivo haciendo un cat, es posible que su caparazón esté configurado incorrectamente y no imprima la línea si no hay un final de línea.
std::endl agrega un \ny flush.

+3

Sí, intenta hacer 'archivo cat; echo'. Sin embargo, no hay que usar 'endl' sin pensar. Odio el código que usa esa construcción estúpida y me gustaría que los estándares lo quitaran del estándar. Enrojecimiento es costoso, y siempre debe hacerse conscientemente y con premeditación. – Omnifarious

+0

El problema fue el editor de errores utilizado en mi trabajo que no muestra la línea si no hay '\ n' al final. Obviamente, vi lo muestra bien. Gracias. –

0

¿El

file << "Hello world" << std::endl; 

trabajo?

endl inserta una nueva línea y vacía el búfer. ¿Es a eso a lo que se refería cuando dijo que ya había intentado lavarlo?

4

No sabe si esto es lo que ha intentado, pero que debe hacer:

file << "Hello World" << std::flush; 

actualización; estoy dejando esta respuesta aquí debido a los comentarios útiles

basadas en los comentarios, voy a modificar mi consejo: no debe tener una llamada explícita std::flush (o file.close() para el caso), porque el destructor hace para ti.

Además, llamar a flush explícitamente fuerza una operación de E/S que puede no ser la forma más optimizada. Diferir el iostreams subyacente y el sistema operativo sería mejor.

Obviamente, el problema del OP no estaba relacionado con llamar o no llamar al std::flush, y probablemente fue debido a intentar leer el archivo antes de que se llamara al destructor de la secuencia de archivos.

+2

El destructor 'ofstream' debe vaciarse automáticamente. – Omnifarious

+0

@Omnifarious: ¿Eso merece un voto negativo? ¿Mi respuesta * está mal *? –

+1

@ John Weldon - Es incorrecto porque realmente no aborda el problema real de los PO. Puede ser útil para depurar y descubrir cuál es el verdadero problema (y, por lo tanto, debe haber un comentario), pero no es una solución en sí misma. Si se trata de una solución, sugiere una solución de estilo de culto de carga en la que se inserta el código sin comprender por qué debe estar allí. – Omnifarious

4

El destructor debe enjuagar y cerrar el archivo.

Estoy bastante seguro, el error es un otro lugar, ya sea

1) no marca en el punto correcto en el tiempo. ¿En qué punto compara el contenido del archivo, "después" de las salidas, o establece un punto de interrupción antes de que el programa salga y luego verifica el contenido de los archivos?

2) ¿De alguna manera el programa se bloquea antes de que se cierre?

+0

Sí, si el programa como tal se ejecuta y luego de que está completamente terminado y recuperas el mensaje, no contiene los datos, hay un error en alguna parte. – Omnifarious

Cuestiones relacionadas