C++输入输出类的层次

在 C++ 中,输入输出数据的传送过程称为流。一个流就是一个字节序列,对流可以进行读或写操作。

输入输出类层次可以分为输入输出流类层次和缓冲类层次,我们先来看一下 C++ 的输入输出流类层次,见下图。


在 C++ 中,输入输出流层次是从 ios_basic 类开始的,该类作为所有类的基类,之后它派生出了 basic_ios 类,这两个类是整个输入输出流类层次的基类,但是它们在功能上有些区别:ios_basic 和 basic_ios 都在一定程度上描述了流的基本性质,但是 ios_basic 并没有考虑流的字符集,而 basic_ios 在描述流的基本性质时考虑了此点。

basic_ios 类派生出了 basic_istream 和 basic_ostream 类,其中 basic_istream 类用于描述输入流,而 basic_ostream 用于描述输出流。 basic_istream 和 basic_ostream 类分别继承了 ios_base 和 basic_ios 类中的成员函数,并且增添了自己的成员函数,例如分别对左移操作符和右移操作符的重载函数。

basic_iostream 类同时继承了 basic_istream 类和 basic_ostream 类,该类并没有新增成员变量,在成员函数方面,它也只是增添了构造函数和析构函数。而 basic_ifstream 和 basic_ofstream 类分别继承自 basic_istream 类和 basic_ostream 类,basic_ifstream 和 basic_ofstream 类主要是对文件进行读写操作。

在 C++ 中,输入和输出并不是直接进行读和写操作的,通常读和写操作是通过一个缓冲区来进行的。当计算机收到写字符的请求时,计算机并不会将等待写入的字符直接写入到输出流中,而是将其先写到缓冲区中,然后定期地将缓冲区中的字符写入到输出流中,此过程我们称之为清扫缓冲区,通常缓冲区满或者换行符会带动一次将缓冲区中的字符写到输出流中。读入操作也同样会经过缓冲区,也有类似的过程。

在缓冲类层次中,所有缓冲类都从公共基类 basic_streambuf 类派生而来,见下图。字符流缓冲类 basic_stringbuf 和文件缓冲类 basic_filebuf,这两个类为输入输出类提供输入输出服务,它们从 basic_streambuf 类中继承了对缓冲区读写操作的函数。


在程序中声明头文件,就相当于在程序中声明了相关的类,可以说头文件是程序与类库的接口,在大致了解了输入输出类层次之后,我们来看一下头文件的用途。

头文件 用途
iosfwd 包含一些基本的类声明
iostream 声明了 cin、cout 等对象
ios 声明了 ios_base 类和 basic_ios 类
streambuf 声明了 basic_streambuf 类
istream 声明了 basic_istream 类和 basic_iostream 类
ostream 声明了 basic_ostream 类
iomanip 声明了用于格式化处理的操纵符
sstream 声明了 basic_stringbuf 类和 stringstream 类
fstream 声明了 basic_filebuf 类和 fstream 类
 
在这些头文件中我们常用头文件有:iostream、fstream、strstream、iomanip。Iostream 头文件中包含了对输入输出流进行操作所需要的基本信息,fstream 则用于对文件的读写操作,strstream 头文件可以用于输入输出字符串,而 iomanip 则主要是用于格式化输入输出。