2010-02-26 17 views
11

Sono su MacOSX.C++ std :: ofstream flush() ma non chiuso()

Nella sezione di registrazione della mia applicazione, sto scaricando i dati su un file.

Supponiamo che io sono un dichiarato globalmente std::ofstream outFile("log");

e nel mio codice di registrazione ho:

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

Ora, supponiamo miei crash codice dopo il flush() accade; Le cose vengono scritte su outFile prima che lo flush() venga scritto su disco (nota che non chiamo un close()).

Grazie!

+0

'outFile <<" ....... "<< std :: flush;' è un codice più leggibile. –

risposta

11

Dal punto di vista del runtime di C++, avrebbe dovuto essere scritto sul disco. Dal punto di vista del sistema operativo, potrebbe persistere in un buffer, ma questo sarà solo un problema se l'intera macchina si blocca.

2

flush() svuota i buffer della libreria iostream - tuttavia i dati quasi certamente non vengono immediatamente scaricati dai buffer del sistema operativo esattamente nello stesso momento, quindi durante un periodo in cui un arresto anomalo del sistema operativo potrebbe perdere i dati . Ovviamente puoi perdere dati in qualsiasi momento se si soffre di un errore del disco rigido, se i dati sono stati scritti o meno, quindi non mi preoccuperei troppo di questo.

0

Finché flush() è tornato, il programma ha messo correttamente l'output nelle mani del sistema operativo. A meno che il sistema operativo (o il disco) non si blocchi, i tuoi dati dovrebbero essere sul disco la prossima volta che scrive il disco (nota che il disco probabilmente ha una sua cache a stato solido).

Fino a quando non viene restituito flush(), nessuno può immaginare quanto riuscirà a farlo sul disco.

6

Come approccio alternativo, è possibile disabilitare il buffering del tutto con

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

Scrivendo a un unbuffered fstream possono compromettere le prestazioni, ma preoccuparsi che prima della misurazione sarebbe ottimizzazione prematura.