15 votes

c++ std::ofstream flush() mais pas close()

Je suis sur MacOSX.

Dans la partie enregistreur de mon application, je déverse des données dans un fichier.

Supposons que j'ai une déclaration globale std::ofstream outFile("log");

et dans mon code de journalisation, j'ai :

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

Maintenant, supposons que mon code se plante après que le flush() ait eu lieu ; est-ce que les données écrites dans le fichier d'échange de données ? outFile avant le flush() garanti d'être écrit sur le disque (notez que je n'appelle pas une close() ).

Merci !

13voto

Timo Geusch Points 16952

Du point de vue du runtime C++, il aurait dû être écrit sur le disque. Du point de vue du système d'exploitation, il peut rester dans une mémoire tampon, mais ce ne sera un problème que si toute votre machine se plante.

7voto

Danilo Piazzalunga Points 3248

Comme approche alternative, vous pouvez désactiver complètement la mise en mémoire tampon avec

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

L'écriture dans un fichier non tamponné fstream peut nuire aux performances, mais s'inquiéter de cela avant de mesurer serait une optimisation prématurée.

2voto

Flush() vide les tampons de la bibliothèque iostream. Cependant, il est presque certain que les données ne sont pas immédiatement vidées des tampons du système d'exploitation exactement au même moment, il y a donc une petite période pendant laquelle un crash du système d'exploitation pourrait vous faire perdre des données. Vous pouvez bien sûr perdre des données à tout moment en cas de défaillance du disque dur, que les données aient été écrites ou non, donc je ne m'inquiéterais pas trop à ce sujet.

2voto

Drew Hall Points 15917

Tant que flush() est retourné, votre programme a réussi à mettre la sortie dans les mains de l'OS. À moins que le système d'exploitation (ou le disque) ne se plante, vos données devraient se trouver sur le disque lors de la prochaine écriture (notez que le disque a probablement son propre cache à l'état solide).

Jusqu'à ce que la fonction flush() revienne, personne ne peut dire combien d'informations arriveront sur le disque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X