缓冲区类
在对数据进行输入输出时,为了减少输入输出的次数,节省计算机资源,常常需要使用到缓冲区,在C++中,系统提供了一个缓冲区流类库,它是以streambuf为父类的类层次,主要完成信息通过缓冲区的交换。streambuf类的层次结构如图1所示。
图1 streambuf类的派生层次
所谓缓冲区,就是当数据传递时,在内存中为每一个数据流开辟的一个用来存放数据流中的数据的地方,又称为缓存,它是内存空间的一部分,也就是说在内存空间预留了一定的存储空间,作为两段不同设备或文件等在传输数据时,需要的过渡桥梁,尤其在基于流的数据传输时,缓存可以说肯定是要使用的,它用来缓冲输入或输出的数据,这部分预留的空间就叫作缓冲区。
streambuf类为所有的streambuf类层次对象设置了一个固定的内存缓冲区,根据缓冲区对应的是输入设备还是输出设备分为输入缓冲区和输出缓冲区,这两个缓冲区可重叠也可不重叠。
因为streambuf是一个抽象类,不会直接使用,一般都是使用其下三个派生类,接下来我们就简单来学习一下这三个派生类。
1、stdiobuf类
stdiobuf类主要用于C++语言的流类层次方法和C语言的标准输入输出方法混合使用时系统的缓冲区管理。
2、filebuf类
filebuf类在streambuf类的基础上增加了文件处理功能,使用文件来保存缓冲区中的字符序列。当写文件时,把缓冲区中的字符序列写到某个指定文件中;当读文件时,把某个指定文件中的字符序列加到缓冲区中。
3、strstreambuf类
strstreambuf类在streambuf类的基础上增加了动态内存管理功能,strstreambuf类实现从内存到缓冲区的信息交换和从缓冲区到内存的信息交换,从而可以在计算机内存之间交换数据信息。
C++系统在定义一些流对象时都会自带有缓冲区,它提供的缓冲区有三种类型:全缓冲、行缓冲和不带缓冲。
● 全缓冲:指直到缓冲区被填满时才调用I/O函数。对于读操作来说,直到读入内容的字节数等于缓冲区大小或者文件已经到达结尾,才进行实际的I/O操作,将外存文件内容读入缓冲区;对于写操作来说,直到缓冲区被填满,才进行实际的I/O操作,将缓冲区内容写到外存文件中。全缓冲操作的典型代表就是磁盘文件的读写。
● 行缓冲:当在输入和输出中遇到换行符或者缓冲区被填满时,才执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。标准的输入输出一般都是行缓冲。
● 无缓冲:没有缓冲区。比如标准错误信息输出对象cerr。
除此之外,用户也可以用上述缓冲区类来自定义缓冲区。但在使用缓冲区时要注意对缓冲的刷新。当数据存储在缓冲区时,如果要执行I/O操作,需要刷新缓冲区,将缓冲区中的数据读/写到某一指定地方,要刷新缓冲区有以下几种方式:
(1)缓冲区满时
(2)执行flush()函数
(3)执行endl语句
(4)关闭文件
在C++中,如果调用flush()函数来刷新缓冲区,它可以执行I/O操作并清空缓冲区;endl控制符的作用是将光标移动到输出设备中下一行开头处,并且清空缓冲区。