当前位置: 首页 > 文档资料 > C++大学教程 >

11.2 C++ 流介绍和使用

优质
小牛编辑
125浏览
2023-12-01

C++ 的I/O是以字节流的形式实现的,流实际上就是一个字节序列。在输入操作中,字节从输入设备(如键盘、磁盘、网络连接等)流向内存;在输出操作中,字节从内存流向输出设备(如显示器、打印机、磁盘、网络连接等)。

应用程序把字节的含义与字节关联起来。字节可以是 ASCII 字符、内部格式的原始数据、图形图像、数字音频、数字视频或其他任何应用程序所需要的信息。
输人/输出系统的任务实际上就是以一种稳定、可靠的方式在设备与内存之间传输数据。传输过程中通常包括一些机械运动,如磁盘和磁带的旋转、在键盘上击键等等,这个过程所花费的时间要比处理器处理数据的时间长得多,因此要使性能发挥到最大程度就需要周密地安排I/O操作。一些介绍操作系统的书籍(见参考文献Dc9O)深入地讨论了这类问题。

C++ 提供了低级和高级I/O功能。低级I/O功能(即无格式 I/O)通常只在设备和内存之间传输一些字节。这种传输过程以单个字节为单位.它确实能够提供高速度并且可以大容量的传输,但是使用起来不太方便。

人们通常更愿意使用高级I/O功能(即格式化 I/O)。高级 I/O 把若干个字节组合成有意义的单位,如整数、浮点数、字符、字符串以及用户自定义类型的数据。这种面向类型的 I/O 功能适合于大多数情况下的输入输出,但在处理大容量的 I/O 时不是很好。

11.2.1 iostream 类库的头文件

C++ 的 iostream 类库提供了数百种 I/O 功能,iostream 类库的接口部分包含在几个头文件中。

头文件 iostream.h 包含了操作所有输入/输出流所需的基本信息,因此大多数 C++ 程序都应该包含这个头文件。头文件 iostream.h 中含有 cin、cout、cerr、clog 4个对象,对应于标准输入流、标准输出流、非缓冲和经缓冲的标准错误流。该头文件提供了无格式 I/O 功能和格式化 I/O 功能。

在执行格式化 I/O 时,如果流中带有含参数的流操纵算子,头文件 iomanip.h 所包含的信息是有用的。

头文件 fstream.h 所包含的信息对由用户控制的文件处理操作比较重要。第13章将在文件处理程序中使用这个头文件。

每一种 C++ 版本通常还包括其他一些与 I/O 相关的库,这些库提供了特定系统的某些功能,如控制专门用途的音频和视频设备。

11.2.2 输入/输出流类和对象

iostream 类库包含了许多用于处理大量I/O操作的类。其中,类istream支持流输入操作.类ostream支持流输出操作,类iostream同时支持流输入和输出操作。

类istream和类ostream是通过单一继承从基类ios派生而来的。类iostream是通过多重继承从类istream和ostream派生而来的。继承的层次结构见图11.1。

运算符重载为完成输入/输出提供了一种方便的途径。重载的左移位运算符(<<)表示流的输出,称为流插入运算符;重载的右移位运算符(>>)表示流的输入,称为流读取运算符。这两个运算符可以和标准流对象 cin、cout、cerr、clog 以及用户自定义的流对象—起使用。

cin 是类 istream 的对象,它与标准输入设备(通常指键盘)连在一起。下面的语句用流读取运算符把整数变量grade(假设grade为int类型)的值从cin输入到内存中。

cin >> grade;

注意,流读取运算符完全能够识别所处理数据的类型。假设已经正确地声明了grade的类型,那么没有必要为指明数据类型而给流读取运算符添加类型信息。
cout是类ostream的对象,它与标准输出设备(通常指显示设备)连在一起。下面的语句用流插入运算符cout把整型变量grade的值从内存输出到标准输出设备上。

cout << grade;

注意,流插入运算符完全能够识别变量grade的数据类型,假定已经正确地声明了该变量,那么没有必要再为指明数据类型而给流插入运算符添加类型信息。
cerr是类osteam的对象,它与标准错误输出设备连在一起。到对象cerr的输出是非缓冲输出,也就是说插入到cerr中的输出会被立即显示出来,非缓冲输出可迅速把出错信息告诉用户。

clog 是类 ostream 的对象,它与标准错误输出设备连在一起。到对象clog的输出是缓冲翰出。即每次插入clog可能使其输出保持在缓冲区,要等缓冲区刷新时才输出。

C++ 中的文件处理用类ifstream执行文件的输入操作,用类 ofstream 执行文件的输出操作,用类fstream执行文件的输入/输出操作。类ifstream继承了类istream,类ofstream继承了类ostream,类fstream继承了类iostream。与I/O相关的类的继承关系见图 11.2。

虽然多数系统所支持的完整的输入/输出流类层次结构中还有很多类,但这里列出的类能够实现多数程序员所需要的绝大部分功能。如果想更多地了解有关文件处理的内容,可参看C++系统中的类库指南。