我正在阅读cplusplus.com I/O教程,该教程的结尾提到fstream缓冲区与磁盘上的文件同步。
显式地使用操纵符: 当在流上使用某些操纵符时,会发生显式同步。这些操纵符包括: flush 和 endl。
以及
显式地使用成员函数sync(): 调用流的成员函数sync(),不带参数,会立即进行同步。如果流没有关联的缓冲区或出现故障,则此函数返回一个等于-1的int值。否则(如果流缓冲区成功同步),它将返回0。
除了一些隐式情况外(例如销毁和stream.close()),还有其他几种情况。
调用fstream::flush()、fstream::sync()和endl之间有什么区别?
在我的代码中,我总是使用flush()。
有关std::flush()的文档:
刷新流缓冲区 将与流相关联的缓冲区与其受控输出序列同步。这实际上意味着缓冲区中所有未写入的字符都尽可能快地被写入其受控输出序列("刷新")。std::streambuf::sync() 的文档:
将输入缓冲区与字符源同步 调用此函数以将流缓冲区与受控序列(例如文件流中的文件)同步。公共成员函数 pubsync 调用此保护成员函数执行此操作。如果这是一个新手问题,请原谅;我是个新手。
basic_filebuf
基于basic_streambuf
,后者具有一个sync
函数,除非被覆盖,否则不会执行任何操作,并且不特定于文件。另一方面,basic_filebuf
对此函数的覆盖是针对文件特别定义的。 - Agentlienflush()
与输出流相关,而sync()
与输出缓冲区相关。flush()
基本上调用底层缓冲区的sync()
,无论是文件缓冲区还是其他任何缓冲区。OP询问fstream::flush()
和fstream::sync()
之间的区别,而您描述的是basic_ostream
和basic_filebuf
之间的区别,所以我不明白这里发生了什么。 - mip