缓冲区

用户对流进行操作时,不是直接对设备进行数据读写交换的,而是有个中间区即缓冲区给数据缓冲。例如系统标准输出函数,在获取到用户输出数据时,系统会把数据暂时存放在缓冲,然后等待刷新缓冲区,再把数据传送给设备,最后把信息显示在显示屏。写文件也是如此,在写数据到文件时,会先把数据存放在缓冲,待刷新把数据写入文件。

设备写操作是比较耗性能的,用户对输出流的每一次操作的数据都不经过缓冲区,而直接进行设备的写操作,可想而知是非常耗时的。所以在设备与用户之间增加缓冲区,让数据缓冲与此,待条件满足,便设备写一次就可以把所有数据写入到指定输出设备。


导致缓冲区刷新有以下几种
1.程序正常结束

程序正常结束,缓冲区刷新,把缓冲区中的数据全部输出到指定的设备或文件。注意这里是指程序正常结束,如果程序异常退出是不会刷新缓冲区的,所以当调试一个异常中断的程序时,由于缓冲区不会因程序异常退出而刷新导致理论判断程序异常的代码点和实际不相符


2.利用endl等操作符
cout<<"hello word!"<<endl
输出hello word!\n并立即刷新缓冲区
cout<<"hello word!"<<flush
输出hello word!并立即刷新缓冲区
cout<<"hello word!"<<ends
输出hello word! 并立即刷新缓冲区
三者区别就是在字符串末尾添加额外字符
endl添加换行符
flush不添加任何字符

ends添加空格


3.利用unibuf设置流的状态
cout<<unibuf
对流设置unibuf,后续对流的操作都是立即刷新缓冲区
如果要恢复流正常状态,即不立即刷新

cout<<nounibuf


4.缓冲区已满
5.流关联另一个流
如果我们把cin关联到cout,那么对cin的读操作会导致cout缓冲区刷新
cin.tie(&cout) cin关联到cout
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值