每个IO对象管理一个缓冲区。
执行cout<<"12345"; 字符串只是被存储在于流cout关联的缓冲区中,并不直接输出到设备。 只有一些时间触发,导致缓冲区内容被刷新,缓冲区内容才输出到设备。
触发条件包括:
1. 程序结束, main函数返回。
2. 缓冲区已满,缓冲区在写下一个值之前刷新
3. 用操作符显示刷新,例如endl, flush, ends
4. unitbuf设置状态,所有输出被刷新, nounitbuf取消此状态
5. 输入流与输出流关联, 例如 cin.tie(&cout); 输入之前保证cout缓冲区被刷新。 事实上,C++库已经自动把cout和cin关联到一起了。
输入缓冲区:
cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入。输入缓存没有数据时请求键盘输入。
例如以下代码:
int main(int argc, char* argv[]) {
//cout<<"12345";
//sleep(1);
int num;
while(cin>>num && !cin.eof()) {
cout<<num+1<<endl;
}
return 0;
}
输入
3 4 5 回车
显示
4
5
6
因为回车触发了cin从输入缓冲取数据,每次循环取一个, 知道缓冲区空才请求下一次输入。