再上一篇:第十三章 运算符重载
上一篇:13.2 几个特殊运算符的重载
主页
下一篇:14.2 C++的基本流类体系
再下一篇:14.3 标准设备的输入/输出
文章列表

第十四章 输入/输出流类库

《VC++程序设计基础》,讲述C++语言的语法和标准库,以及Visual C++ 函数库和MFC类库的使用,并附相关代码示例。

输入/输出(Input/Output,简称 I/O)是指程序与计算机的外部设备之间进行信息交换。输出操作将一个对象转换为一个字符序列,输出到某一个地方;输入操作从某一个地方接收到一个字符序列,然后将其转换为对象所要求的格式赋给对象。接收输出数据的地方称为目的,输入数据来自的地方称为源。输入/输出操作可以看成是字符序列在源和目的之间对象的流动。因此,将执行这个输入/输出操作的类体系称为流类,提供这个流类实现的系统称为流类库。C++提供了功能强大的流类库。本章主要介绍流类库提供的格式化输入/输出和文件的输入/输出。

14.1概述

在C++中,没有专门的输入/输出语句,为了方便用户灵活地实现输入/输出,C++提供了两套输入/输出方法:一套是为了与C语言保持兼容,提供了与C语言兼容的输入/输出库函数。在C++程序中不提倡使用这种库函数来实现输入/输出。另一套是功能强大的输入/输出流类库。为了保持C++面向对象编程的特色,建议在C++程序中使用输入/输出流类库。14.1.1 流(Stream)

C++语言的输入/输出系统向程序设计者提供一个统一的接口,使得程序的设计尽量与所访问的具体设备无关,在程序员与被使用的设备之间提供了一个抽象的界面——流。

当前为计算机配备的输入/输出设备各式各样,对不同的输入/输出设备,其输入/输出的操作方式不同。为了简化这种因设备而异的操作方式,C++提供了逻辑设备的概念。对任一逻辑设备而言,基本的操作只有几种:从逻辑设备上读取数据,将数据写入逻辑设备。用户很容易掌握这种逻辑设备的简单操作方式。而将逻辑设备的操作转换成具体设备的输入/输出操作由流自动完成。从用户使用逻辑设备的角度而言,所有逻辑设备的行为是相同的,接口是一致的。用户用同一个写操作的成员函数可以实现对一个磁盘文件的写操作,也可以实现将输出信息送向显示器显示,还可实现将输出信息送打印机打印。

C++提供了两种类型的流:文本流和二进制流。文本流是一串 ASCII字符。如源程序文件和文本文件(如文字处理软件产生的数据文件)都是文本流,这种文本流可以直接输出到显示器或送到打印机上打印。二进制流是将数据以二进制形式存放的,这种流在数据传输时不需作任何变换。

使用流类库来完成输入/输出,比使用传统语言中的库函数至少有两个方面的优点:首先是流具有严格的类型检查机制,可减少因使用不当而引起的程序错误。另一方面,流是面向对象的,可以利用类的继承性和多态性,给用户提供统一的接口,因而使用较少的成员函数就能实现更多的功能。

14.1.2 文件

流是 C++对所有的外部设备的逻辑抽象,而文件则是 C++对具体设备的抽象。如一个源程序可作为一个文件,一个描述类的数据结构、一个可执行程序、一台显示器、一台打印机等都可看作为一个文件。把设备看作文件,用户只要掌握使用文件的方法,就可以使用具有不同特性的设备。对于流,其使用行为是相同的,而不同文件可能具有不同的行为,即允许执行不同的操作。如对于磁盘文件,可以将数据写入文件中,也可以将数据从文件中取出;而对于打印机文件,只能将数据写入文件,而不能从打印机文件中读取数据。

14.1.3 缓冲

系统在主存中开辟一个专用的区域用来临时存放输入/输出信息,如先将源输入的信息送到该区域,然后从该区域中取出数据。系统在主存中开辟的这种区域称为缓冲区。

输入/输出流可以是缓冲的,也可以是非缓冲的。对于非缓冲流,一旦数据送入流中,立即进行处理;而对于缓冲流,只有当缓冲区满时,或当前送入的数据为新的一行字符时,系统才对流中的数据进行处理(称为刷新)。引入缓冲的目的主要是为了提高系统的效率,因为输入/输出设备的速度要比 CPU慢得多,频繁地与外设交换信息必将占用大量的CPU时间,从而降低程序的运行速度。使用缓冲后,CPU只要从缓冲区中取数据或者把数据写入缓冲区,而不要等待设备具体输入/输出操作的完成。通常情况下使用缓冲流,但对于某些特殊场合,也可使用非缓冲流。