关闭 fstream 是不是保证文件系统同步?

Posted

技术标签:

【中文标题】关闭 fstream 是不是保证文件系统同步?【英文标题】:Does closing an fstream guarantee a filesystem sync?关闭 fstream 是否保证文件系统同步? 【发布时间】:2013-10-31 01:09:03 【问题描述】:

关闭 fstream 是否保证同步到文件系统?我正在与一位同事讨论这个问题,需要一个明确的参考。我对标准所说的内容以及在使用 Visual Studio 实现的 Windows 上发生的事情感兴趣。

另外,如果关闭并不意味着同步,是否有标准的 C++ 方法来确保同步完成?

【问题讨论】:

查看答案:***.com/a/13358458/717732 Force write of a file to disk 的可能重复项 - 它不是此问题的确切重复项,但其中一个很好的答案完全匹配。 您无需关心后续程序的“数据是否在磁盘上”。即使它只是在文件系统缓存中,下面的程序也会看到它。否则操作系统会严重损坏。你当然可以依赖 fclose() 暗示 fflush(). @EJP:然后阅读标准并停止猜测:§ 27.9.1.4(又名 [filebuf.members]),第 6 项:“...函数关闭文件(好像通过调用 @ 987654325@)。” @static_rtti 来自 C11 草案(我没有最终文档):7.21.5.1 说“成功调用 fclose 函数会导致流指向的流被刷新并关联要关闭的文件。流的任何未写入的缓冲数据都将传递到主机环境以写入文件 [...]"。如果数据可能丢失,关闭文件有什么意义?如果当然不能保证操作系统不会在某处缓存操作,这就是操作系统的问题,请阅读操作系统文档。在 POSIX 上,我们可以使用 fsync() 来确保数据安全。 【参考方案1】:

我很确定它已经解决了关闭文件流如何关闭缓冲区的问题。所以,现在,缓冲区:

draft of Std'1998: 27.8.1.3.6: basic_filebuf* close();

6 效果:如果 is_open() == false,则返回一个空指针。如果存在放置区域,则调用 overflow(EOF) 以刷新字符。 (...) 最后它关闭文件 (''as if'' 通过调用 std::fclose(file)).308) 如果任何对溢出或 std::fclose 的调用失败然后关闭失败。

现在,请参阅overflow():27.8.1.4.8 (...)

然后我试图进一步追踪它,在下面的某个地方有一些对syncsputc 的引用,但我无法追踪overflow 如何保证冲洗的确切措辞。确实如此,但抱歉,我今天的时间到了:/

【讨论】:

感谢您的努力!我希望有资格的人可以从那里接手。【参考方案2】:

std::basic_filebuf::close 调用std::fclose,它声明:“任何未写入的缓冲数据都被刷新到操作系统”,或者根据the C99 standard draft n1256,“任何未写入的流缓冲数据都被传递到主机环境以写入文件”。

【讨论】:

以上是关于关闭 fstream 是不是保证文件系统同步?的主要内容,如果未能解决你的问题,请参考以下文章

C ++ OpenGL fstream问题[关闭]

fstream指针

如何使用 fstream::open() 检查 C++ 中是不是存在文件

使用 fstream 打开文本文件,但文件名字符不是 ASCII [重复]

保存系统不打开 fstream 文件?

C++fstream问题,如何判断一个文件是不是为空