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

Я на MacOSX.

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

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

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

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

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

Спасибо!


person anon    schedule 26.02.2010    source источник
comment
outFile << "......." << std::flush; - более читаемый код.   -  person    schedule 27.07.2014


Ответы (4)


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

person Timo Geusch    schedule 26.02.2010

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

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

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

person Danilo Piazzalunga    schedule 26.02.2010

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

person Community    schedule 26.02.2010

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

До тех пор, пока функция flush() не вернётся, можно только гадать, сколько будет записано на диск.

person Drew Hall    schedule 26.02.2010