我在MacOSX上。
在我的应用程序的记录器部分,我正在将数据转储到文件中。
假设我有一个全局声明的std::ofstream outFile("log");
在我的日志代码中我有:
outFile << "......." ;
outFile.flush();
现在,假设我的代码在flush()发生后崩溃了;在outFile
保证写入磁盘之前写入flush()
的内容(请注意,我不会调用close()
)。
谢谢!
答案 0 :(得分:13)
从C ++运行时的角度来看,它本应写入磁盘。从操作系统的角度来看,它可能仍然存在于缓冲区中,但如果您的整个机器崩溃,那只会是一个问题。
答案 1 :(得分:6)
作为替代方法,您可以使用
完全禁用缓冲outFile.rdbuf()->pubsetbuf(0, 0);
写入无缓冲的fstream
可能会影响性能,但在测量之前担心这会导致过早优化。
答案 2 :(得分:2)
flush()刷新iostream库的缓冲区 - 但是数据几乎肯定不会立即从操作系统的缓冲区中立即刷新,因此在一段时间内操作系统崩溃可能会丢失数据。如果您遇到硬盘故障,无论数据是否已写入,您当然可以随时丢失数据,因此我不会过于担心这一点。
答案 3 :(得分:2)
只要flush()返回,您的程序就已成功将输出放在OS的手中。除非操作系统(或磁盘)崩溃,否则下次磁盘写入时您的数据应该在磁盘上(请注意,磁盘可能具有自己的固态缓存)。
直到flush()返回,任何人都猜测它将在多大程度上进入磁盘。