清华大学出版社 TSINGHUA UNIVERSITY PRESS 第13章文件 13.1 C文件概述 13.2 文件类型指针 13.3 文件的打开与关闭 13.4 文件的读写 13.5 文件的定位 13.6 出错的检测 13.7 文件输入输出小结 习题
第13章 文 件 13.1 C文件概述 13.2 文件类型指针 13.3 文件的打开与关闭 13.4 文件的读写 13.5 文件的定位 13.6 出错的检测 13.7 文件输入输出小结 习题
清华大学出版社 TSINGHUA UNIVERSITY PRESS 13.1C文件概述 文件(fle)是程序设计中一个重要的概念。所谓“文件” 一般指存储在外部介质上数据的集合。一批数据是以 文件的形式存放在外部介质(如磁盘)上的。操作系统 是以文件为单位对数据进行管理的,也就是说,如果 想找存在外部介质上的数据,必须先按文件名找到所 指定的文件,然后再从该文件中读取数据。要向外部 介质上存储数据也必须先建立一个文件(以文件名标 识),才能向它输出数据。 ·以前各章中所用到的输入和输出,都是以终端为对象 的,即从终端键盘输入数据,运行结果输出到终端上。 从操作系统的角度看,每一个与主机相联的输入输出 设备都看作是一个文件。例如,终端键盘是输入文件
13.1 C文件概述 • 文件(file)是程序设计中一个重要的概念。所谓“文件” 一般指存储在外部介质上数据的集合。一批数据是以 文件的形式存放在外部介质(如磁盘)上的。操作系统 是以文件为单位对数据进行管理的,也就是说,如果 想找存在外部介质上的数据,必须先按文件名找到所 指定的文件,然后再从该文件中读取数据。要向外部 介质上存储数据也必须先建立一个文件(以文件名标 识),才能向它输出数据。 • 以前各章中所用到的输入和输出,都是以终端为对象 的,即从终端键盘输入数据,运行结果输出到终端上。 从操作系统的角度看,每一个与主机相联的输入输出 设备都看作是一个文件。例如,终端键盘是输入文件
清华大学出版社 TSINGHUA UNIVERSITY PRESS 显示屏和打印机是输出文件。 在程序运行时,常常需要将一些数据(运行的最终结 果或中间数据)输出到磁盘上存放起来,以后需要时 再从磁盘中输入到计算机内存。这就要用到磁盘文 件。 C语言把文件看作是一个字符(字节)的序列,即由 一个一个字符(字节)的数据顺序组成。根据数据的 组织形式,可分为ASC文件和二进制文件。 ASC文件又称文本(text)文件,它的每一个字节放 一个ASCⅡ代码,代表一个字符。二进制文件是把 内存中的数据按其在内存中的存储形式原样输出到 磁盘上存放。如果有一个整数10000,在内存中占2 个字节,如果按ASCⅡ码形式输出,则占5个字节
显示屏和打印机是输出文件。 • 在程序运行时,常常需要将一些数据(运行的最终结 果或中间数据)输出到磁盘上存放起来,以后需要时 再从磁盘中输入到计算机内存。这就要用到磁盘文 件。 • C语言把文件看作是一个字符(字节)的序列,即由 一个一个字符(字节)的数据顺序组成。根据数据的 组织形式,可分为ASCII文件和二进制文件。 ASCII文件又称文本(text)文件,它的每一个字节放 一个ASCII代码,代表一个字符。二进制文件是把 内存中的数据按其在内存中的存储形式原样输出到 磁盘上存放。如果有一个整数10000,在内存中占2 个字节,如果按ASCII码形式输出,则占5个字节
清华大学出版社 TSINGHUA UNIVERSITY PRESS 而按二进制形式输出,在磁盘上只占2个字节,见 图13.1。用ASCⅢ码形式输出与字符一一对应, 个字节代表一个字符,一个字节代表一个字符, 因而便于对字符进行逐个处理,也便于输出字符。 但一般占存储空间较多,而且要花费转换时间(二 进制形式与ASCⅡ码间的转换)。用二进制形式输 出数值,可以节省外存空间和转换时间,但一个 字节并不对应一个字符,不能直接输出字符形式。 一般中间结果数据需要暂时保存在外存上以后又 需要输入到内存的,常用二进制文件保存
而按二进制形式输出,在磁盘上只占2个字节,见 图13.1。用ASCII码形式输出与字符一一对应,一 个字节代表一个字符,一个字节代表一个字符, 因而便于对字符进行逐个处理,也便于输出字符。 但一般占存储空间较多,而且要花费转换时间(二 进制形式与ASCII码间的转换)。用二进制形式输 出数值,可以节省外存空间和转换时间,但一个 字节并不对应一个字符,不能直接输出字符形式。 一般中间结果数据需要暂时保存在外存上以后又 需要输入到内存的,常用二进制文件保存
清华大学出版社 TSINGHUA UNIVERSITY PRESS 0011000100110000001100000011000000110000 内存中存 (0) 储形式 0010011100010000 二进制形式 0010011100010000 。图13.1 ·由前所述,一个C文件是一个字节流或二进制流。 它把数据看作是一连串的字符(字节),而不考虑记 录的界限。换句话说,C语言中文件并不是由记 录(record组成的(这是和PASCAL或其他高级语言 不同的)。在C语言中对文件的存取是以字符(字节) 为单位的。输入输出的数据流的开始和结束仅受 程序控制而不受物理符号(如回车换行符)控制
• • 图13.1 • 由前所述,一个C文件是一个字节流或二进制流。 它把数据看作是一连串的字符(字节),而不考虑记 录的界限。换句话说,C语言中文件并不是由记 录(record)组成的(这是和PASCAL或其他高级语言 不同的)。在C语言中对文件的存取是以字符(字节) 为单位的。输入输出的数据流的开始和结束仅受 程序控制而不受物理符号(如回车换行符)控制
清华大学出版社 TSINGHUA UNIVERSITY PRESS 也就是说,在输出时不会自动增加回车换行符以作 为记录结束的标志,输入时不以回车换行符作为记 录的间隔(事实上C文件并不由记录构成)。我们把 这种文件称为流式文件。C语言允许对文件存取一 个字符,这就增加了处理的灵活性。 在过去使用的C版本(如UNX系统下使用的C)有两 种对文件的处理方法:一种叫“缓冲文件系统”, 一种叫“非缓冲文件系统”。所谓缓冲文件系统是 指系统自动地在内存区为每一个正在使用的文件名 开辟一个缓冲区。从内存向磁盘输出数据必须先送 到内存中的缓冲区,装满缓冲区后才一起送到磁盘 去。如果从磁盘向内存读入数据,则一次从磁盘文 件将一批数据输入到内存缓冲区(充满缓冲区),然 后再
• 也就是说,在输出时不会自动增加回车换行符以作 为记录结束的标志,输入时不以回车换行符作为记 录的间隔(事实上C文件并不由记录构成)。我们把 这种文件称为流式文件。C语言允许对文件存取一 个字符,这就增加了处理的灵活性。 • 在过去使用的C版本(如UNIX系统下使用的C)有两 种对文件的处理方法:一种叫“缓冲文件系统”, 一种叫“非缓冲文件系统”。所谓缓冲文件系统是 指系统自动地在内存区为每一个正在使用的文件名 开辟一个缓冲区。从内存向磁盘输出数据必须先送 到内存中的缓冲区,装满缓冲区后才一起送到磁盘 去。如果从磁盘向内存读入数据,则一次从磁盘文 件将一批数据输入到内存缓冲区(充满缓冲区),然 后再
清华大学出版社 TSINGHUA UNIVERSITY PRESS 从缓冲区逐个地将数据送到程序数据区(给程序变 量)。见图13.2。缓冲区的大小由各个具体的C版 本确定,一般为512字节。 输出文件缓冲区 磁盘 程序数据区 输出 输出 输入文件缓冲区 输入 输入 图13.2
图13.2 从缓冲区逐个地将数据送到程序数据区(给程序变 量)。见图13.2。缓冲区的大小由各个具体的C版 本确定,一般为512字节
清华大学出版社 TSINGHUA UNIVERSITY PRESS 所谓“非缓冲文件系统”是指系统不自动开辟确 定大小的缓冲区,而由程序为每个文件设定缓冲 区。 。 在UNX系统下,用缓冲文件系统来处理文本文件, 用非缓冲文件系统处理二进制文件。用缓冲文件 系统进行的输入输出又称为高级(或高层)磁盘输入 输出(高层/O),用非缓冲文件系统进行的输入输 出又称为低级(低层)输入输出系统。ANSI C标准 决定不采用非缓冲文件系统,而只采用缓冲文件 系统。即既用缓冲文件系统处理文本文件,也用 它来处理二进制文件。也就是将缓冲文件系统扩 充为可以处理二进制文件。 在C语言中,没有输入输出语句,对文件的读写 都是且库函数来实现的。AS规定了标准输入输
• 所谓“非缓冲文件系统”是指系统不自动开辟确 定大小的缓冲区,而由程序为每个文件设定缓冲 区。 • 在UNIX系统下,用缓冲文件系统来处理文本文件, 用非缓冲文件系统处理二进制文件。用缓冲文件 系统进行的输入输出又称为高级(或高层)磁盘输入 输出(高层I/O),用非缓冲文件系统进行的输入输 出又称为低级(低层)输入输出系统。ANSI C标准 决定不采用非缓冲文件系统,而只采用缓冲文件 系统。即既用缓冲文件系统处理文本文件,也用 它来处理二进制文件。也就是将缓冲文件系统扩 充为可以处理二进制文件。 • 在C语言中,没有输入输出语句,对文件的读写 都是用库函数来实现的。ANSI规定了标准输入输
清华大学出版社 TSINGHUA UNIVERSITY PRESS 出函数,用它们对文件进行读写。 ·本章只介绍ANSI C规定的文件系统以及对它的读 写。 13.2文件类型指针 缓冲文件系统中,关键的概念是“文件指针” 每个被使用的文件都在内存中开辟一个区,用来 存放文件的有关信息(如文件的名字、文件状态及 文件当前位置等)。这些信息是保存在一个结构体 变量中的。该结构体类型是由系统定义的,取名 为FLE。Turbo C在stdio.,h文件中有以下的文件 类型声明:
出函数,用它们对文件进行读写。 • 本章只介绍ANSI C规定的文件系统以及对它的读 写。 13.2 文件类型指针 • 缓冲文件系统中,关键的概念是“文件指针”。 每个被使用的文件都在内存中开辟一个区,用来 存放文件的有关信息(如文件的名字、文件状态及 文件当前位置等)。这些信息是保存在一个结构体 变量中的。该结构体类型是由系统定义的,取名 为FILE。Turbo C在stdio.h文件中有以下的文件 类型声明:
清华大学出版社 TSINGHUA UNIVERSITY PRESS typedef struct {shortlevel;/*缓冲区“满”或“空”的程度*/ unsignedflags; /文件状态标志*/ charfd; /*文件描述符*/ unsignedcharhold;/*如无缓冲区不读取字符*/ shortbsize; /*缓冲区的大小*/ unsignedchar*?baffer;:/*数据缓冲区的位置*/ unsignedar*curp;/*指针,当前的指向*/ unsignedistemp;/*临时文件,指示器*/ shorttoken;/*用于有效性检查*/ FILE;
typedef struct {shortlevel; /*缓冲区“满”或“空”的程度*/ unsignedflags; /*文件状态标志*/ charfd; /*文件描述符*/ unsignedcharhold; /*如无缓冲区不读取字符*/ shortbsize; /*缓冲区的大小*/ unsignedchar*baffer;/*数据缓冲区的位置*/ unsignedar*curp;/*指针,当前的指向*/ unsignedistemp;/*临时文件,指示器*/ shorttoken;/*用于有效性检查*/ }FILE;