1、每个输出流都管理一个缓冲区,用来保存程序读写的数据
2、进行输出时,文本串可能被立即打印出来,也有可能被操作系统保存在缓冲区中,随后打印
3、有了缓冲机制,操作系统就可以将程序的多个输出操作组合成单一的系统级写操作。由于设备的写操作可能很耗时,允许系统将多个输出操作组合为单一的设备写操作可以带来很大的性能提升。
4、缓冲刷新,即将数据真正写到输出设备或文件
5、缓冲刷新的原因可能有:
- 程序正常结束,作为main函数的return操作一部分,执行缓冲刷新
- 缓冲区满时,需要刷新缓冲,然后新的数据才能继续写入到缓冲区
- 可以使用操纵符如endl来显式刷新缓冲区
- 在每个输出操作后,可以用操纵符unitbuf设置流的内部状态,清空缓冲区
- 一个输出流可能被关联到另一个流。在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新。例如cin和cerr都关联到cout。因此,读cin或写cerr都会导致cout的缓冲区被刷新
6、flush刷新缓冲区,但不输出任何的额外字符。ends向缓冲区插入一个空字符,然后刷新缓冲区
cout<<"C++"<<endl; //输出C++和一个换行,然后刷新缓冲区
cout<<"C++"<<flush; //输出C++,然后刷新缓冲区
cout<<"C++"<<ends; //输出C++和一个空字符,然后刷新缓冲区
7、使用unitbuf操纵符,可以在接下来的每次写操作后都进行一次flush操作。nounitbuf操作符则重置流,使其恢复使用正常的系统管理的缓冲区刷新机制:
cout<<unitbuf;
//任何输出立即刷新,无缓冲
cout<<nounitbuf;
//恢复正常缓冲方式
8、如果程序异常终止,输出缓冲区是不会被刷新的。当一个程序崩溃后,它所输出的数据很可能停留在输出缓冲区中等待打印。
9、交互式系统通常应该关联输入流和输出流。这意味着所有输出,包括用户提示信息,都会在读操作之前被打印出来。