/*
下面几种情况导致缓冲区里的内容被刷新:
(1) 程序正常结束。
(2) 缓冲区满。
(3) 用操作符显示刷新缓冲区,例如行结束符endl
(4) 在每次输出操作执行完后,用unitbuf操作符设置流的内部状态,从而清空缓冲区
(5) 将输入流和输出流关联起来。在这种情况下,在读输入流时将刷新其关联的输出缓冲区
这里要注意一点,如果我们运行程序崩溃了,输出缓冲区是不会被刷新的。
*/
#include <iostream>
using namespace std;
/*int main()
{
cout<<"hi";
cout<<"hello";
int i= 0;
cin >> i;
while(1);
/*
如果你将cin>>i;这条语句删除,不打印任何东西。
加上这条语句,则能打印。这是因为标准库将cout与cin绑在一起的。
当绑在一起时。任何读输入流的尝试都将首先刷新输出流关联的缓冲区。
}*/
int main()
{
cout<<"hi";
int i = 0;
ostream *old_tie = cin.tie();//得到以前绑定的流的指针。
//tie函数可用istream,ostream对象调用,使用一个指向ostream对象的指针形参
cin.tie(&cout);
cin.tie(0);//书上说如果在调用tie函数时传递实参0,则打破该流上的已存在的捆绑。这里并没有打破。在进行cin操作时,还是刷新了输出流缓冲区。打印了hi。
cin>>i;
while(1);
}
int main()
{
cout<<"hi"<<flush; //刷新缓冲区,但是输出中不添加任何字符。
cout<<"hi"<<ends; //书上说:ends,这个操作符在缓冲区中插入空字符null,然后刷新它。
//我在ubuntu上测试,根本就没有刷新缓冲区,用ends。
cout<<"hi"<<endl; //插入一个换行符,然后刷新缓冲区。
cout<<"hi";
cout << unitbuf <<"first"<<"second"<<nounitbuf;
/*unitbuf 这个操作符在执行完后写操作后,都刷新流。
nounitbuf操作符将流恢复为使用正常的,由系统管理的缓冲区刷新方式。
*/
while(1);
/*
输出结果:
hihihi
hifirstsecond
*/
}