【C++】std::cout与std::cin缓冲区
C++输入输出缓冲区:
由于iostream中的cin和cout设有缓冲区(iostream的每个输出流都管理一个缓冲区,用来保存程序读写的数据),当用户要对外部设备写入或读出数据时,会默认将需输出到流对象的内容先放入缓冲区,并不会立即输出,当缓冲区收到刷新信号时,先将数据写入或读出,然后再刷新缓冲区,即清空缓冲区,进行下一轮的读写操作。
缓冲区接收到什么样的信号才将其视为刷新信号?
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语句的写入