C++中ofstream未调用close遇断电:是否会导致数据损坏?
关于ofstream写入后断电未close是否会导致数据损坏的问题
结论:不会出现数据损坏,但数据大概率没写到磁盘里
拆解一下原因:
ofstream::write只是把数据塞进了C++标准库维护的用户态缓冲区,默认不会立刻同步到磁盘。如果此时断电,缓冲区里的这部分数据直接丢失,但已经写到磁盘的内容不会出问题——要么文件是之前的状态(比如空文件或者旧内容),要么已经刷盘的部分是完整的。- 所谓“数据损坏”是指文件出现乱码、不完整的结构导致无法正常读取,这种情况不会发生:要么数据完全没落地,要么落地的部分是完整的。
- 你示例里的代码,
write执行后数据还在内存里,断电后t.bin要么是空的,要么保留之前的旧内容,不会出现损坏的情况。
如果要确保数据一定写到磁盘,不能只等close(毕竟断电前没执行到就白搭),得主动做两步:
- 调用
fos.flush():把标准库的用户态缓冲区数据刷到操作系统的内核缓冲区。 - 调用系统级的
fsync(比如Linux下需要包含<unistd.h>,用fsync(fos.fd())):强制操作系统把内核缓冲区的数据写到物理磁盘上。
内容的提问来源于stack exchange,提问作者le Mandarin
相关产品推荐
相关产品推荐

