流与缓冲区

流与缓冲区

1. 参考资料

    《C++ Primer Plus(第五版)》 p651-654,p656,p660


2. 流

    C++程序将输入和输出看作字节,注意是字节流,这个输入和输出是针对控制台来说的。输入时,程序从输入流中抽取字节;输出时,程序将字节插入到输出流中。在程序中,很多数据被组织成比字节更大的单位。例如,int类型由16位或32位的二进制数据表示,double类型由64位二进制数据表示。但是C++将输出看作字节流,也就是希望每个字节代表一个字符值,这就必然带来转换问题。所以,ostream类最重要的任务之一就是将数值类型(如int和double)转换为文本形式表示的字符流(字节流,一字符由一字节存储),即ostream类将数据内部表示(二进制形式)转换为由字符字节组成的输出流。

    对于面向文本的程序,每个字节代表一个字符。

    管理输入包含两步:

        a. 将流与文件连接起来(来源);

        b. 将流与输入目的地程序关联起来(去向)。

    换句话说,输入流需要两个连接,包括输入流的来源和去向。

    管理输出也包含两步:

        a. 将流与输出程序关联起来(出处);

        b. 将流与目标输出位置连接起来(去向)。

图1. 输入和输出管理(图片来源与参考资料的p652)

3. 缓冲区

    缓冲区是用作中介的内存块,它是将信息从设备传输到程序或从程序传输给设备的临时存储工具。通过使用缓冲区可以更高效地处理输入和输出。

    通常,对于像磁盘驱动器这样的设备,以512字节(或512字节的整数倍)大小的块为单位来传输信息;对于C++输入输出程序,以一个字节大小为单位进行传输处理。显然,两种设备的传输速率是不同的,缓冲区可以帮助匹配这两种不同的信息传输速率。例如,程序要读取磁盘中的某信息时,先以块的形式从磁盘读取信息到缓冲区,再以字节的形式从缓冲区读取信息进行处理。对于磁盘的读取操作是比较慢的,对于缓冲区的内存读取操作更快,所以前者可按块读,后者可按字节读。

    输出时,程序首先填满缓冲区;然后,刷新缓冲区(把整块数据传输给硬盘,并清空缓冲区以备下一批输出使用)。由于缓冲区至少为512字节或512字节的整数倍,而输出的数据可能大于小于或等于缓冲区大小,等待缓冲区存满然后再输出不是一个好做法。所以还有其他事件触发刷新缓冲区。以下几种情况下将刷新缓冲区:

    (1) 缓冲区被填满;

    (2) 换行符被发送到缓冲区;

    (3) 即将发生输入;

    (4) 控制符 flush 强制刷新缓冲区,如 cout<<"hello, this is ...."<<flush;

    (5) flush() 方法(函数)强制刷新缓冲区,如 flush(cout);

    (6) 控制符endl强制刷新缓冲区,不过控制符 endl 比 flush 多一个功能,即 endl 还将插入一个换行符;

    (7)endl() 方法(函数)强制刷新缓冲区,功能同 (6) 一样,具体代码为:endl(cout);

    虽然键盘输入每次提供一个字符,程序无需缓冲区来帮助匹配不同数据的传输速率,但是对键盘输入进行缓冲可以让用户在将输入传输给程序之前返回并更正。所以键盘输入也采用缓冲区协助。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值