ITEEDU

第11章_C++输入/输出流

教学目标

●了解怎样使用C++面向对象的输入/输出流

●能够格式化输入和输出

●了解I/O流类的层次结构

●了解怎样输入/输出用户自定义类型的对象

●能够建立用户自定义的流操纵算子

●能够确定/输出操作的成功与失败

●能够把输入输出流连到输人流上

11.1 简介

C++标准库提供了—组扩展的输入/输出(I/O)功能。本章将详细介绍C++中最常用的一些I/O 操作,并对其余的输入/输出功能做一简要的概述。本章的有些内容已经在前面提到,这里对输入/输出功能做一个更全面的介绍。

本章讨论的许多输入/输出功能都是面向对象的,读者会发现C++的I/O操作能够实现许多功能。C++式的I/O中还大量利用了C++的其他许多特点,如引用、函数重载和运算符重载等等。

C++使用的是类型安全(typesafe)的I/O操作,各种I/O操作都是以对数据类型敏感的方式来执行的。假定某个函数被专门定义好用来处理某一特定的数据类型,那么当需要的时候,该函数会被自动调用以处理所对应的数据类型。如果实际的数据类型和函数之间不匹配,就会产生编译错误。

因此,错误数据是不可能通过系统检测的(C语言则不然。这是C语言的漏洞,会导致某些相当微妙而又奇怪的错误)。

用户既可以指定自定义类型的I/O,也可以指定标准类型的I/O。这种可扩展性是C++最有价值的特点之一。

编程技巧11.1

尽管C语言式的I/O在C++中是可以使用的,但还是应该尽量使用C++特有的I/O格式。

软件工程视点11.1

C++式的I/O是类型安全的。

软件工程视点11. 2

C++允许对预定义类型和自定义类型的I/O用同样的方法处理.从而可加快软件的开发过程,特别是能够提高软件的复用性。

11.2 流

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.1

处理大容量文件最好使用无格式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相关的库,这些库提供了特定系统的某些功能,如控制专门用途的音频和视频设备。