c++IO操作<2>
来源:互联网 发布:数据分析岗位认识 编辑:程序博客网 时间:2024/05/17 06:44
/* 下面几种情况导致缓冲区里的内容被刷新: (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 */}