devo chiudere uno std :: fstream?

Possibile duplicato:
Devo chiudere manualmente un ifstream?

Devo chiamare fstream.close() o è fstream un object RAII appropriato che chiude il stream in caso di distruzione?

Ho un object std::ofstream locale all’interno di un metodo. Posso presumere che il file sia sempre chiuso dopo essere uscito da questo metodo senza chiamare close? Non sono riuscito a trovare la documentazione del distruttore.

Penso che le risposte precedenti siano fuorvianti.

fstream è un object RAII adatto, si chiude automaticamente alla fine dell’ambito e non è assolutamente necessario chiamare manualmente quando la chiusura alla fine dell’ambito è sufficiente.

In particolare, non è una “best practice” e non è necessario svuotare l’output.

E mentre Drakosha ha ragione nel dire che close ti dà la possibilità di controllare il bit di fail del stream, nessuno lo fa comunque.

In un mondo ideale, si dovrebbe semplicemente chiamare stream.exception(ios::failbit) anticipo e gestire l’eccezione che viene lanciata nel fstream un fstream . Ma sfortunatamente le eccezioni nei distruttori sono un concetto rotto in C ++, quindi non è una buona idea.

Quindi, se vuoi verificare il successo della chiusura di un file, fallo manualmente (ma solo allora).

Per aggiungere la risposta di Amy Lee, è meglio farlo manualmente perché in questo modo puoi controllare anche gli errori.

A proposito, secondo la manpage “close” :

Non controllare il valore di ritorno di close () è un errore di programmazione comune ma comunque serio . È abbastanza probabile che gli errori su una precedente operazione di scrittura (2) vengano prima segnalati alla chiusura finale (). La mancata verifica del valore restituito al momento della chiusura del file può comportare una perdita di dati silenziosa. Questo può essere osservato in particolare con NFS e con quota disco.

Una chiusura corretta non garantisce che i dati siano stati salvati correttamente sul disco , come scrive il kernel. Non è comune per un filesystem svuotare i buffer quando lo stream è chiuso. Se è necessario accertarsi che i dati siano archiviati fisicamente, utilizzare fsync (2). (Dipenderà dall’hardware del disco a questo punto.)

Penso che sia una buona pratica chiudere il tuo stream, perché è necessario svuotare il buffer, ciò che mi è stato detto