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

cjc*_*rie 15 c++ buffer fstream stream ostream

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

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

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

除了一些其他隐式案例(例如destroy和stream.close())

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

在我的代码中,我总是使用flush().

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

刷新流缓冲区

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

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

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

调用它来使流缓冲区与受控序列同步(就像文件流中的文件一样).公共成员函数pubsync调用此受保护的成员函数来执行此操作.

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

Age*_*ien 15

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

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

endl 当应用于a时ostream,它'\n'会向流写入,然后调用flush该流.

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

  • @cjcurrie内核在写入文件时总是参与其中,但不一定在转向流时,因为流可以绑定到完全由库处理的内容(例如字符串流). (2认同)
  • 我想说,区别在于“flush()”与输出流相关,而“sync()”与输出缓冲区相关。`flush()` 基本调用底层缓冲区的 `sync()`,无论是文件缓冲区还是任何其他缓冲区。OP询问“fstream::flush()”和“fstream::sync()”之间的区别,而你描述了“basic_ostream”和“basic_filebuf”之间的区别,所以我不明白这里发生了什么。 (2认同)

per*_*eal 5

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