ate
posiziona semplicemente alla fine del file dopo l'apertura e nient'altro. Non è molto utile su un ofstream
, almeno senza altri flag, poiché il file sarà stato troncato comunque, quindi l'inizio è la fine. (Per evitare il troncamento, e di essere ancora in grado di scrivere in qualsiasi parte del file, è necessario o in ios::in
così, anche se non avete intenzione di leggere.)
app
impedisce il troncamento di un file esistente, e fa sì che ogni scrittura vada alla fine del file. Atomicamente, se possibile; se altri processi scrivono sullo stesso file, la tua scrittura dovrebbe ancora andare alla fine. Si noti tuttavia che questo si riferisce alla scrittura del livello di sistema effettivo. Se, tuttavia, si scrivono righe inferiori alla dimensione del buffer e si termina ogni riga con std::endl
, è possibile contare su ogni riga aggiunta in modo atomico, indipendentemente da ciò che altri processi potrebbero fare con il file. Per essere efficace, probabilmente si desidera utilizzare pubsetbuf
su filebuf
per garantire una dimensione minima del buffer.
In pratica, non credo di aver mai usato nessuno di loro, né trovato di alcun uso.I problemi di buffering con app
, in particolare, mi hanno portato in genere a scrivere il mio streambuf
, con buffering concettualmente illimitato (uno std::vector<char>
come buffer), che apre il file di sistema sottostante con l'equivalente di app
, ma garantisce solo la scrittura su di esso quando esplicitamente svuotato (come con `std :: endl).
fonte
2012-10-17 08:34:26
In pratica, l''app' cerca sempre fino alla fine prima di scrivere qualsiasi cosa, mentre 'ate' ti consente di cercare dopo l'apertura e di mantenerla lì. Vedi [questa domanda] (http://stackoverflow.com/questions/10359702/c-filehandling-difference-between-iosapp-and-iosate). – chris