Вопрос

Я на MacOSX.

В части logger моего приложения я сбрасываю данные в файл.

предположим, у меня есть глобально объявленный std::ofstream outFile("log");

и в моем коде ведения журнала у меня есть:

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

Теперь предположим, что мой код выходит из строя после выполнения flush();Это материал, написанный для outFile перед тем, как flush() гарантированно записывается на диск (обратите внимание, что я не вызываю close()).

Спасибо!

Это было полезно?

Решение

С точки зрения среды выполнения C ++, он должен был быть записан на диск.С точки зрения операционной системы он все еще может задерживаться в буфере, но это будет проблемой только в том случае, если вся ваша машина выйдет из строя.

Другие советы

В качестве альтернативного подхода вы можете полностью отключить буферизацию с помощью

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

Запись в небуферизованный fstream это может снизить производительность, но беспокоиться об этом перед измерением было бы преждевременной оптимизацией.

flush() очищает буферы библиотеки iostream - однако данные почти наверняка не сразу удаляются из буферов операционной системы в одно и то же время, поэтому существует небольшой период, в течение которого сбой операционной системы может привести к потере ваших данных.Конечно, вы можете потерять данные в любой момент, если у вас произошел сбой жесткого диска, независимо от того, были данные записаны или нет, так что я бы не стал слишком беспокоиться по этому поводу.

До тех пор, пока flush() возвращается, ваша программа успешно передала выходные данные в руки операционной системы.Если ОС (или диск) не выйдет из строя, ваши данные должны быть на диске при следующей записи на диск (обратите внимание, что на диске, скорее всего, есть собственный твердотельный кэш).

Пока не вернется функция flush(), можно только гадать, сколько ее останется на диске.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top