C++缓冲区,IO模型,流,对象
1.为什么没有缓冲区,数据读取效率低?
缓冲区就是内存中的区域,如果没有缓冲区,程序就不能和内存交互,只能和硬盘交互。硬盘存储信息以512字节(或更多) 的块为单位,那传输信息自然也是;而程序只能一个字节一个字节地读取数据,二者读取的速率并不匹配,硬盘先要把512字节取出来,然后等待程序逐字节地读取数据,在程序完成读取之前,硬盘处于等待状态,这样并没有发挥硬盘读取数据的能力,另外程序需要大量与硬盘交互,这样会造成许多额外的开销。因此,我们考虑缓冲区,硬盘先把数据放到缓冲区(内存)中,然后程序逐字节地读取数据,由于内存读取速度快于硬盘,并且硬盘可以一直向缓冲区传输数据而无需等待,从而大大地提升读取效率!
2.键盘输入为什么需要缓冲区?
对于键盘输入,每次按键地数据量十分小(通常只有一个字符),而用户按键频率低,因此键盘产生的数据可以被程序接受而无需缓冲区,那么设置缓冲区的目的是什么呢?
设置缓冲区是为了给予用户“容错”的机会,用户输入的字符会被保留在缓冲区,如果用户不小心输错了,可以在缓冲区中修改,然后按下回车(换行),表示输入完成,然后程序再读取数据。如果没有缓冲区,从键盘中输入的任何字符都将直接送给程序,这十分“冒进”!
3.在C++中,对象代表流?
对象代表流,其中「对象」是指通过「类类型」创建的「类对象」,「流」指「字符流」。
对象封装了对字符流读取和写入的实现细节,只是提供使用接口。我们可以通过类对象来调用接口(公共成员函数),从而实现把数据写入到字符流中或者从字符流中读取数据。
载入iostream文件就自动地创建了cout对象,创建这样的对象会自动创建缓冲区,并且将cout对象和其流关联起来,同时cout对象可以使用类成员函数对流(字符流)处理。
比如:cout<<"Bjarne free" ;, 把字符串"Bjarne free"放入到cout的缓冲区中,相当于字符串"Bjarne free"和cout关联起来,然后cout调用成员函数对"Bjarne free"进行处理。
使用ostream对象 (如cout)来处理输出。创建这样的对象将打开一个流,自动创建缓冲 区,并将其与流关联起来,同时使得能够使用类成员函数。
std::cin
和std::cout
就是两个最常见的流对象,根据上面所述,对象代表流,因此对「类对象」处理,可以认为就是对「字符流」处理,当然,这样做的前提是,先要把类对象和字符流关联起来。比如,对于cin来说,就是把cin和键盘的字符流关联起来,对cin处理,相当于对键盘输入的字符流处理;ifstream类类型定义的类对象就是和文件流关联起来,比如 ifstream in (file);,类对象in和文件file关联起来,对类对象in处理,相当于对file文件流处理,通过in读取数据,相当于对文件中的文件流读取数据。