用户对流进行操作时,不是直接对设备进行数据读写交换的,而是有个中间区即缓冲区给数据缓冲。例如系统标准输出函数,在获取到用户输出数据时,系统会把数据暂时存放在缓冲,然后等待刷新缓冲区,再把数据传送给设备,最后把信息显示在显示屏。写文件也是如此,在写数据到文件时,会先把数据存放在缓冲,待刷新把数据写入文件。
1.程序正常结束
cout<<"hello word!"<<endl
输出hello word!\n并立即刷新缓冲区
cout<<"hello word!"<<flush
输出hello word!并立即刷新缓冲区
cout<<"hello word!"<<ends
输出hello word! 并立即刷新缓冲区
三者区别就是在字符串末尾添加额外字符
endl添加换行符
flush不添加任何字符
cout<<unibuf
对流设置unibuf,后续对流的操作都是立即刷新缓冲区
如果要恢复流正常状态,即不立即刷新
5.流关联另一个流
如果我们把cin关联到cout,那么对cin的读操作会导致cout缓冲区刷新
cin.tie(&cout) cin关联到cout
设备写操作是比较耗性能的,用户对输出流的每一次操作的数据都不经过缓冲区,而直接进行设备的写操作,可想而知是非常耗时的。所以在设备与用户之间增加缓冲区,让数据缓冲与此,待条件满足,便设备写一次就可以把所有数据写入到指定输出设备。
1.程序正常结束
程序正常结束,缓冲区刷新,把缓冲区中的数据全部输出到指定的设备或文件。注意这里是指程序正常结束,如果程序异常退出是不会刷新缓冲区的,所以当调试一个异常中断的程序时,由于缓冲区不会因程序异常退出而刷新导致理论判断程序异常的代码点和实际不相符
cout<<"hello word!"<<endl
输出hello word!\n并立即刷新缓冲区
cout<<"hello word!"<<flush
输出hello word!并立即刷新缓冲区
cout<<"hello word!"<<ends
输出hello word! 并立即刷新缓冲区
三者区别就是在字符串末尾添加额外字符
endl添加换行符
flush不添加任何字符
ends添加空格
cout<<unibuf
对流设置unibuf,后续对流的操作都是立即刷新缓冲区
如果要恢复流正常状态,即不立即刷新
cout<<nounibuf
5.流关联另一个流
如果我们把cin关联到cout,那么对cin的读操作会导致cout缓冲区刷新
cin.tie(&cout) cin关联到cout