我正在阅读 关于 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 许可协议
basic_ostream::flush 这是一个 非虚拟 函数,它将未提交的更改写入底层缓冲区。如果发生错误,它会在使用的流对象中设置一个 _错误标志_。这是因为返回值是对流本身的引用,以允许链接。
basic_filebuf::sync 这是一个 虚 函数,它将所有挂起的更改写入底层文件并返回 错误代码 以表示成功或失败。
endl 当应用于
ostream
时,将'\n'
写入流,然后在该流上调用flush
。因此,本质上:
flush
是任何流的更通用功能,而sync
明确绑定到文件。flush
是非虚拟的,而sync
是虚拟的。这改变了在继承的情况下如何通过指针(指向基类)使用它们。此外,它们在报告错误的方式上有所不同。