第九章的焦点是C++中的流类库及其在输入输出中的应用。C++不直接提供输入/输出语句,而是采用一个内置的I/O流类库,它是C++标准库的关键部分,与标准模板库同等重要。这个库通过抽象概念“流”来处理数据的传输,使数据的输入和输出变得方便。
流是连接数据源和接收者的一个抽象概念,它负责管理和控制数据的流动。C++中的流类体系是以`basic_ios`为基类的模板系统。`basic_ios`提供用于格式化输入输出和错误处理的成员函数。`basic_istream`模板类处理提取(输入)操作,`basic_ostream`处理插入(输出)操作,而`basic_iostream`则结合了两者,但并未添加新的成员。`basic_streambuf`类管理流的缓冲区,虽不直接继承自`basic_ios`,但与之关联以支持流的缓冲。
C++标准库中预定义了四个全局流对象:`cin`用于标准输入,通常与键盘关联;`cout`用于标准输出,对应显示器;`cerr`和`clog`则是标准错误输出,两者都显示在显示器上,区别在于`cerr`是非缓冲的,错误信息会立即显示,而`clog`带有缓冲区。要使用这些流对象,需包含`<iostream>`头文件。
输入/输出操作通过重载的运算符完成,如提取运算符`>>`用于输入,插入运算符`<<`用于输出。例如,`cin`通常与`>>`配合,`cout`、`cerr`和`clog`则与`<<`一起使用。对于持久化的数据存储,文件处理就显得至关重要。C++提供了对文件的读写操作,不同平台可能有不同的扩展,如MFC编程中的序列化。
在输入输出的格式控制方面,C++提供了丰富的选项来调整输出的布局和样式。例如,`skipws`用于跳过输入中的空白字符,`left`和`right`分别控制输出左对齐和右对齐,`dec`、`oct`和`hex`用于指定数据的进制表示。还有`showbase`在输出时显示基数,`showpoint`确保浮点数输出时包含小数点,`uppercase`在十六进制输出时使用大写字母,以及`showpos`在正数输出时显示加号等。这些格式控制符定义在`ios_base`类中,可应用于所有文本输入输出流。
C++的流类库提供了一种高效且灵活的方式来处理输入输出,包括对标准设备的输入输出、文件操作以及格式控制,从而使得程序能够以结构化的方式与用户和外部存储进行交互。通过理解并熟练掌握流类库,开发者可以编写出更强大、更具可读性的程序。