c ++ std :: ofstream flush (), но не close () - PullRequest
       18

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

13 голосов
/ 26 февраля 2010

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

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

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

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

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

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

Спасибо!

Ответы [ 4 ]

13 голосов
/ 26 февраля 2010

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

6 голосов
/ 26 февраля 2010

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

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

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

2 голосов
/ 26 февраля 2010

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

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

2 голосов
/ 26 февраля 2010

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

...