1
C语言程序设计
1.10.1 9.1 流和文件

9.1 流和文件

在讨论C语言的I/O系统之前,首先介绍一下“流”和“文件”的基本概念。

C语言的I/O系统为编程者提供了一个与具体被访问的设备无关的统一的“接口”,这个“接口”把输入输出的信息抽象为“流”,把具体的实际设备称为“文件”。

流有两种类型:文本流(text stream)和二进制流(binary stream)。文本流是一行行的字符,换行符表示一行的结束。由于文本流是对一个个字符进行存取操作,所以又称为文字流。二进制流是由一系列字节组成的,使用中没有字符的“翻译”过程。

在C语言中,“文件”是一个逻辑概念。文件通常是指存放在外部存储器上的一批数据的集合,如磁盘文件、磁带文件等。计算机系统的键盘、显示终端和打印机等各种外部设备,主要是通过信息流与计算机联系的,从数据输入输出的观点看,可以认为这些外部设备也是文件。因此,在C语言中,“文件”包括磁盘、光盘文件以及所有的外部设备。

C语言的文件系统分为“缓冲型文件系统”(buffered file system)、“非缓冲型文件系统”(unbuffered file system)。通常把缓冲型文件系统提供的函数称为流式I/O函数,把非缓冲型文件系统提供的函数称为低级I/O函数。

由于流式函数将文件或数据项作为单个字符(或字节)构成的数据流来处理。通过选择适当的流式函数,可以处理从单个字符到大型数据结构的不同大小、不同格式的数据。流式函数提供了带缓冲的可格式化的输入输出。由于流式函数在读写流式文件的数据时采用了缓冲存储区域,这就可以传输大量数据,而不是每读写一个数据项都要进行一次I/O操作,提高了输入输出的效率。

低级I/O函数,不执行缓冲或格式化,它们直接调用操作系统的输入输出功能。这些函数只能在比流式函数更低的层次上对文件或外部设备进行访问。从历史上看,由于非缓冲型文件系统,是由UNIX的I/O系统最早定义的,使用这些函数可能出现可移植性不好的问题,现在已用得越来越少,因此本章主要讲述由ANSI C标准定义的缓冲型文件系统。