c++ std::ofstream flush (), mais pas à proximité()
Je suis sous MacOSX.
dans la partie logger de mon application, je jette des données dans un fichier.
supposons que j'ai un déclarés globalement std::ofstream outFile("log");
et mon code d'enregistrement que j'ai:
outFile << "......." ;
outFile.flush();
Maintenant, imaginons que mon code se bloque après le flush (); Est le truc écrit dans outFile
avant flush()
garanti pour être écrit sur le disque (notez que je n'appelle pas un close()
).
Merci!
4 réponses
du point de vue de L'exécution C++, il aurait dû être écrit sur le disque. Du point de vue de L'OS, il pourrait encore s'attarder dans un tampon, mais ce ne sera un problème que si votre machine entière tombe en panne.
comme approche alternative, vous pouvez désactiver complètement le tampon avec
outFile.rdbuf()->pubsetbuf(0, 0);
écrire à un non-accompagné fstream
peut nuire à la performance, mais se soucier de cela avant de mesurer serait une optimisation prématurée.
flush () nettoie les tampons de la bibliothèque iostream - cependant, les données ne sont presque certainement pas évacuées immédiatement 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 si vous souffrez d'une défaillance du disque dur, que les données aient été écrites ou non, donc je ne m'inquiéterais pas trop à ce sujet.
tant que flush () est revenu, 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 s'écrase, vos données devraient être sur le disque la prochaine fois que le disque écrit (notez que le disque a probablement son propre cache à l'état solide).
Jusqu'à ce que flush() revienne, n'importe qui peut deviner ce qui va arriver au disque.