Подтвердить что ты не робот

С++ std:: ofstream flush(), но не close()

Я нахожусь на MacOSX.

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

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

и в моем коде регистрации я:

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

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

Спасибо!

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

До тех пор, пока flush() не вернется, кто-нибудь догадывается, сколько будет сделано на диске.