第8章 标准IO库(3)

8.3 输出缓冲区的管理

8.3 输出缓冲区的管理

每个IO对象管理一个缓冲区,用于存储程序读写的数据。系统将字符串字面值存储在与流关联的缓冲区中。下面几种情况将导致缓冲区的内容被刷新,即写入到真实的输出设备或者文件:

(1) 程序正常结束。作为main返回工作的一部分,将清空所有输出缓冲区。

(2) 在一些不确定的时候,缓冲区可能已经满了,在这种情况下,缓冲区将会在写下一个值之前刷新。

(3) 用操纵符(manipulator)显式地刷新缓冲区,例如行结束符endl。

(4) 在每次输出操作执行完后,用unitbuf操纵符设置流的内部状态,从而清空缓冲区。

(5)可将输出流与输入流关联起来,在这种情况下,在读输入流时将刷新其关联的输出缓冲区。

1. 输出缓冲区的刷新

endl操纵符,用于输出一个换行符并刷新缓冲区。

flush操纵符,用于刷新流,但不在输出中添加任何字符。

ends,这个操纵符在缓冲区中插入空字符null,然后刷新它。

	cout << "Anders" << endl;
	cout << "Anders" << flush;
	cout << "Anders" << ends;
	//Anders
	//AndersAnders 
2. unitbuf

如果需要刷新所有输出,最好使用unitbuf操纵符。这个操纵符在每次执行完写操作后都刷新流。

	cout << unitbuf <<"Anders" << " " << "Fan" << nounitbuf;
等价于:

	cout << "Anders" << flush << " " << flush << "Fan" << flush;
nounitbuf操纵符将流恢复为使用正常的,由系统管理的缓冲区刷新方式。

如果程序崩溃了或不正常结束,输出缓冲区将不会刷新。

3. 将输入和输出绑在一起

当输入流与输出流绑在一起时,任何读输入流的尝试都将首先刷新其输出流相关联的缓冲区。标准库将cout与cin绑在一起。

tie函数可用istream或ostream对象调用,使用一个指向ostream对象的指针形参。如果一个流调用tie函数将其本身绑在传递给tie的ostream实参对象上,则该流上的任何IO操作都会刷新实参所关联的缓冲区。

一个ostream对象每次只能与一个istream对象绑在一起。如果在调用tie函数时传递实参0,则打破该流上已存在的捆绑。

	int i;
	cin.tie(0);
	cout << "First: \n";
	cin >> i;
	cout << "second: \n";
	cin >> i;
cin.tie(&cout)保证cout流会在cin流之前被刷新,在上面的代码中保证first:\n先被打印出来,但是cin.tie(0)后没有这种保证。

按现在的C++标准,cin/cout已经被系统默认tie过了。并且cin还和C的printf也tie过了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值