1.8 流类库
C++中的输入输出是通过流完成的。输出一个数据对象是指将这个对象的数据成员的取值一个个地插入到输出流中;而读入一个数据对象是指把输入流中的数据抽取出来,然后将它们转换成对象。由此可见,数据的输出和输入是一种数据的流动,从一个产生数据的源,流到一个接收数据的目标。源可以是对象或文件,目标也可以是对象或源。连接源和目标的是流,输入和输出都是相对于流而言的。
C++将有关流的属性及相应的输出输入操作封装在一起形成描述流的类(称为流类),并将各种形式的流类汇聚在一处形成一个有关流的系统库——流类库。
Visual C++流类库的结构如图1-7所示。图中的整个类层次在文件iostream.h中得到了说明。ios是一个共享虚基类,类中使用了一个指针对象指向流缓冲区类streambuf的对象,该对象用于管理流的缓冲区。由于具体缓冲区由虚函数virtualstreambuf *streambuf::setbuf(char * p, int len)得到,因此对不同情形会产生文件输出输入缓冲区、字符串输出输入缓冲区或者是标准输出输入缓冲区。鉴于数据封装和隐藏的需要,用户不必关心streambuf类的具体实现,也不必直接使用该类对象。描述输入流的istream类只提供向某个流中插入数据的相关操作,描述输出流的ostream类也只提供从某个流中提取数据的相关操作,而iostream类则继承了上述两个流类的操作和属性,提供对某个流的插入和抽取。
流类ifstream, ofstream及fstream实现了流式文件的输出输入操作。
C++预定义了4个流,即cin, cout, cerror和clog。这4个流与4个具体的输入输出设备相关联,具体说明如下:
① cin与标准输入设备相关联。
② cout与标准输出设备相关联。
③ cerr与标准错误输出设备相关联(非缓冲)。
④ clog与标准错误输出设备相关联(缓冲)。
在默认情况下,操作系统指定的标推输出设备是显示终端,标准输入设备是键盘。而标准错误输出设备则总是显示终端。当然,可以将标准输入输出设备重新定向为其他设备,比如文件等。
图1-7 Visual C++流类库的类层次