web-dev-qa-db-fra.com

dois-je fermer un std :: fstream?

Duplicata possible:
Dois-je fermer manuellement un ifstream?

Dois-je appeler fstream.close() ou fstream est-il un objet RAII approprié qui ferme le flux lors de la destruction?

J'ai un objet std::ofstream Local dans une méthode. Puis-je supposer que le fichier est toujours fermé après avoir quitté cette méthode sans appeler close? Je n'ai pas pu trouver de documentation sur le destructeur.

54
Tobias Langner

Je pense que les réponses précédentes sont trompeuses.

fstream est un objet RAII approprié, il fait se ferme automatiquement à la fin de la portée, et il n'y a absolument aucun besoin d'appeler close manuellement lors de la fermeture à la fin de la la portée est suffisante.

En particulier, ce n'est pas une "meilleure pratique" et il n'est pas nécessaire de vider la sortie.

Et bien que Drakosha ait raison d'appeler close vous donne la possibilité de vérifier le bit d'échec du flux, personne ne le fait de toute façon.

Dans un monde idéal, il suffit d'appeler stream.exception(ios::failbit) au préalable et de gérer l'exception qui est levée dans le destructeur d'un fstream. Mais malheureusement, les exceptions dans les destructeurs sont un concept cassé en C++, donc ce n'est pas une bonne idée.

Donc si vous voulez vérifier le succès de la fermeture d'un fichier, faites-le manuellement (mais alors seulement).

86
Konrad Rudolph

Pour ajouter à la réponse d'Amy Lee, il est préférable de le faire manuellement, car vous pouvez également vérifier les erreurs.

BTW, selon page de manuel "close" :

Ne pas vérifier la valeur de retour de close () est une erreur de programmation courante mais néanmoins sérieuse . Il est tout à fait possible que des erreurs sur une opération d'écriture précédente (2) soient d'abord signalées à la fermeture finale (). Ne pas vérifier la valeur de retour lors de la fermeture du fichier peut entraîner une perte silencieuse de données. Cela peut notamment être observé avec NFS et avec le quota de disque.

Une fermeture réussie ne garantit pas que les données ont bien été enregistrées sur le disque , comme l'écrit le noyau diffère. Il n'est pas courant qu'un système de fichiers vide les tampons lorsque le flux est fermé. Si vous devez être sûr que les données sont stockées physiquement, utilisez fsync (2). (Cela dépendra du matériel du disque à ce stade.)

5
Drakosha

Je pense que c'est une bonne pratique de fermer votre flux, car vous devez vider le tampon, ce que l'on m'a dit

1
Amy Lee