C++ 就fstream缓冲区而言,flush()和sync()之间有什么区别?

C++ 就fstream缓冲区而言,flush()和sync()之间有什么区别?,c++,stream,buffer,fstream,ostream,C++,Stream,Buffer,Fstream,Ostream,我在看报纸。最后,它说fstream缓冲区与磁盘上的文件同步 显式,带操纵器:当某些操纵器用于 流,则会发生显式同步。这些操纵者 分别是:齐平和endl 及 显式,使用成员函数sync():调用 流的成员函数sync()(不带参数)导致 即时同步。此函数返回一个等于 -1如果流没有相关的缓冲区或出现故障。否则(如果流缓冲区已成功同步),它将 返回0 除了一些其他隐式情况(例如destruction和stream.close()) 调用fstream::flush()和fstream::sync(

我在看报纸。最后,它说fstream缓冲区与磁盘上的文件同步

显式,带操纵器:当某些操纵器用于 流,则会发生显式同步。这些操纵者 分别是:齐平和endl

显式,使用成员函数sync():调用 流的成员函数sync()(不带参数)导致 即时同步。此函数返回一个等于 -1如果流没有相关的缓冲区或出现故障。否则(如果流缓冲区已成功同步),它将 返回0

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

调用fstream::flush()和fstream::sync()有什么区别?endl? 在我的代码中,我一直使用flush()

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

刷新流缓冲区

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

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

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

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


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

我的理解如下:

flush()

sync()
将在给定操作系统中尽可能尝试强制实现完全同步,但所涉及的操作系统可能会也可能不会促进这一点

所以
flush()
是:将数据从缓冲区中取出并放入要写入的行中。
sync()


这是我对这一点的理解,但当我思考时,我不记得我是如何理解这一点的,所以我也很想听听其他人的意见。

sync
输入流的成员,所有未读字符都会从缓冲区中清除
flush
output
流的成员,缓冲输出被传递到内核。

basic\u ostream::flush 这是一个非虚拟函数,用于将未限制的更改写入基础缓冲区。如果出现错误,它会在使用的流对象中设置错误标志。这是因为返回值是对流本身的引用,以允许链接

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

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


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

C++I/O涉及许多类之间的协作:流、缓冲区、区域设置和区域设置::facet-s

特别是
sync
flush
都是
stream
streambuf
中存在的成员函数,因此请注意您所引用的文档,因为它们的作用不同

On streams
flush
告诉流告诉缓冲区(注意重定向)将其内容刷新到目标上。这确保没有“挂起的写入”保留


std::endl
,当应用于
流时,答案非常好。您能否确认/澄清DWright和perreal关于内核处理flush()和库处理sync()的陈述(当内核无法足够快地安排写入时?@cjcurrie内核在写入文件时总是参与,但在写入流时不一定参与,因为流可以绑定到完全由库处理的东西(例如stringstream)。谢谢!我想这就是为什么John Cormack在QuakeCon'11上谈论文件分页这么久的原因。这是错误的,sync()函数不写任何东西。它用于与输入数据同步,而不是与输出数据同步。我想说的是,区别在于
flush()
与输出流相关,而
sync()
与输出缓冲区相关
flush()
basic调用底层缓冲区的
sync()
,无论它是文件缓冲区还是任何其他缓冲区。OP询问了
fstream::flush()
fstream::sync()
之间的区别,而您描述了
basic\u ostream
basic\u filebuf
之间的区别,所以我不明白这里发生了什么。在流和总是在流之间有什么区别?恐怕我不明白你在这里的意思。我谈到了流、缓冲区和其他东西(地区…)。当说“在流上”时,我的意思是“而不是在缓冲区上”。如果愿意,可以使用“with”而不是“on”。
thestream.put('\n'); thestream.flush();