关于 fstream 缓冲区,flush() 和 sync() 有什么区别?

新手上路,请多包涵

我正在阅读 关于 I/O 的 cplusplus.com 教程。最后,它说 fstream 缓冲区与磁盘上的文件同步

显式地,使用操纵器: 当在流上使用某些操纵器时,会发生显式同步。这些操纵器是:flush 和 endl。

明确地,使用成员函数sync(): 调用不带参数的流的成员函数sync() 会导致立即同步。如果流没有关联的缓冲区或发生故障,此函数返回一个等于 -1 的 int 值。否则(如果流缓冲区已成功同步),则返回 0。

除了一些其他隐式情况(例如破坏和 stream.close() )

调用 fstream::flush() 和 fstream::sync() 有什么区别?结束?

在我的代码中,我一直使用flush()。

关于 std::flush() 的文档:

刷新流缓冲区

将与流关联的缓冲区同步到其受控的输出序列。这实际上意味着缓冲区中的所有未写入字符都将尽快写入其受控输出序列(“刷新”)。

关于 std::streambuf::sync() 的文档:

将输入缓冲区与字符源同步

调用它以将流缓冲区与受控序列(如文件流中的文件)同步。公共成员函数 pubsync 调用这个受保护的成员函数来执行这个动作。

如果这是一个新手问题,请原谅我;我是菜鸟。

原文由 cjcurrie 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3.6k
2 个回答

basic_ostream::flush 这是一个 非虚拟 函数,它将未提交的更改写入底层缓冲区。如果发生错误,它会在使用的流对象中设置一个 _错误标志_。这是因为返回值是对流本身的引用,以允许链接。

basic_filebuf::sync 这是一个 函数,它将所有挂起的更改写入底层文件并返回 错误代码 以表示成功或失败。

endl 当应用于 ostream 时,将 '\n' 写入流,然后在该流上调用 flush

因此,本质上: flush 是任何流的更通用功能,而 sync 明确绑定到文件。 flush 是非虚拟的,而 sync 是虚拟的。这改变了在继承的情况下如何通过指针(指向基类)使用它们。此外,它们在报告错误的方式上有所不同。

原文由 Agentlien 发布,翻译遵循 CC BY-SA 3.0 许可协议

syncinput 流的成员,所有未读字符都从缓冲区中清除。 flushoutput 流的成员,缓冲的输出被传递给内核。

原文由 perreal 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题