2010-02-26 23 views
11

Estoy en MacOSX.C++ std :: ofstream flush() pero no close()

En la parte de registro de mi aplicación, estoy volcando datos a un archivo.

Supongamos que tengo un nivel global declarada std::ofstream outFile("log");

y en mi código de registro que tengo:

outFile << "......." ; 
outFile.flush(); 

Ahora, supongamos que mis accidentes de código después de la descarga() que pasa; Es el material escrito en outFile antes de que el flush() garantizado para ser escrito en el disco (tenga en cuenta que no llamo a close()).

Gracias!

+0

'outFile <<" ....... "<< std :: flush;' es un código más legible. –

Respuesta

11

Desde el punto de vista del tiempo de ejecución de C++, debería haberse escrito en el disco. Desde la perspectiva del sistema operativo, es posible que aún permanezca en un búfer, pero eso solo será un problema si se bloquea toda la máquina.

2

flush() vuelca buffers de la biblioteca iostream - sin embargo, los datos no es casi seguro que inmediatamente añade desde los buffers del sistema operativo exactamente al mismo tiempo, así que hay un pequeño periodo durante en el que un fallo del sistema operativo podría perder sus datos . Por supuesto, puede perder datos en cualquier momento si sufre una falla en el disco duro, si los datos fueron escritos o no, así que no me preocuparía demasiado por esto.

0

Mientras que flush() haya regresado, su programa ha puesto exitosamente la salida en manos del sistema operativo. A menos que el SO (o el disco) se bloquee, sus datos deberían estar en el disco la próxima vez que el disco escriba (tenga en cuenta que el disco probablemente tenga un caché de estado sólido propio).

Hasta que flush() regrese, nadie sabe cuánto llegará al disco.

6

Como un enfoque alternativo, se puede desactivar el almacenamiento en búfer en conjunto con

outFile.rdbuf()->pubsetbuf(0, 0); 

Escribiendo a un fstream sin búfer puede perjudicar el rendimiento, pero la preocupación de que antes de la medición sería la optimización prematura.

Cuestiones relacionadas