由于iostream中的cin和cout设有缓冲区(iostream的每个输出流都管理一个缓冲区,用来保存程序读写的数据),当用户要对外部设备写入或读出数据时,会默认将需输出到流对象的内容先放入缓冲区,并不会立即输出,当缓冲区收到刷新信号时,先将数据写入或读出,然后再刷新缓冲区,即清空缓冲区,进行下一轮的读写操作。

缓冲区(buffer):

一个存储区域,用于保存数据。IO设施通常将输入(或输出)数据保存在一个缓冲区中,读取缓冲区的动作与程序中的动作是无关的。我们可以显式地刷新输出缓冲,以便强制将缓冲区中的数据写入输出设备。

那么,缓冲区接到什么样信号才将其视为刷新信号呢?

  1. 缓冲区已满,当继续向缓冲区写入数据时,写入/读出缓冲区数据,然后刷新缓冲区,再写入下一个数据
  2. 执行flush、endl或ends等语句时,假设你cout一段字符串,且字符串长度适合不至于过长,那么当你在每个字符串后不输入endl换行操作,而在全部字符串后输入时,你会发现,在终端上是没有任何的输出的,直到endl执行后,执行换行操作,同时将缓冲队列内容强制输出并清楚缓冲队列。其中,flush刷新缓冲区,但不输出任何额外的字符,而ends向缓冲区插入一个空字符,然后刷新缓冲区
  3. 程序正常结束时,作为main函数的return操作的一部分,刷新缓冲区
  4. 通过unitbuf操纵符设置流的内部状态,清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的
  5. cin和cout切换时,比如说当你用cin接收,但是你并没有给缓冲区刷新的信号,此时,由于cin和cout的缓冲区是捆绑的,当你紧接着使用cout时,缓冲区则会自动的刷新,进行cout语句的写入

注:

如果程序崩溃时 ,输出缓冲区不会被刷新

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐