第6章文件 《程序设计基础一C语言》龙昭华主编 §6.1文件概述 §6.2文件类型指针 §6.3文件操作的相关函数 §6.4应用举例 38R,B/啣术88888888 38853: 坛htp/www.elecfans.com电子发 1/31
http://bbs.elecfans.com 电子技术论 坛 http://www.elecfans.com 电子发 烧友 第6章 文 件 §6.1 文件概述 §6.2 文件类型指针 §6.3 文件操作的相关函数 §6.4 应用举例 1 / 31 《程序设计基础-C语言》 龙昭华主编
§6.1文件概述 (第6章文件) 、C文件的概念 所谓的“文件”(file)一般指:存储在外部介质上的相关数据的集合。存 文件的外部介质有磁带、磁盘、光盘等外部存储器。数据包括:数字、文字 图形、图象、声音、视频等。在本章所讲的文件是由数字和文字组成的数据文 件 以前各章中所用到的输入输出,都是以屏幕等(标准输出文件指针: stdout) 为输出设备,以键盘(标准输入文件指针: stdin)为输入设备。而程序运行有时 需要把数据存放到磁盘中,这就要用到磁盘文件。 C语言把文件看作是一个字符(字节)的序列,即由一个一个的字符或字节的 数据顺序组成。换句话说,C语言是把每一个文件都看作是一个有序的字节流。 01234 ●●●。 n-2n-1结束标志 流是文件和程序之间的通道。一个C程序可以创建文件和对文件内容进行更 新、修改,在程序中所需的数据也可以从另一个文件中获得 对文件的操作一般通过三个步骤完成:打开文件、读或写文件、关闭文件 坛htp/www.elecfans.com电子发 2/31
http://bbs.elecfans.com 电子技术论 坛 http://www.elecfans.com 电子发 烧友 §6.1 文件概述 (第6章 文 件) 2 / 31 所谓的“文件”(file)一般指:存储在外部介质上的相关数据的集合。存放 文件的外部介质有磁带、磁盘、光盘等外部存储器。数据包括:数字、文字、 图形、图象、声音、视频等。在本章所讲的文件是由数字和文字组成的数据文 件。 以前各章中所用到的输入输出,都是以屏幕等(标准输出文件指针:stdout) 为输出设备,以键盘(标准输入文件指针:stdin)为输入设备。而程序运行有时 需要把数据存放到磁盘中,这就要用到磁盘文件。 C语言把文件看作是一个字符(字节)的序列,即由一个一个的字符或字节的 数据顺序组成。换句话说,C语言是把每一个文件都看作是一个有序的字节流。 一、C文件的概念 0 1 2 3 4 ……… n-2 n-1 结束标志 流是文件和程序之间的通道。一个C程序可以创建文件和对文件内容进行更 新、修改,在程序中所需的数据也可以从另一个文件中获得。 对文件的操作一般通过三个步骤完成:打开文件、读或写文件、关闭文件
§6.1文件概述 (第6章文件) 二、文件系统 在C语言中,根据操作系统对文件的处理方式的不同,把文件系统分为缓冲 文件系统和非缓冲文件系统。 ANSI C标准采用缓冲文件系统。 缓冲文件系统(又称标准I/0是指操作系统在内存中为每一个正在使用的文 件开辟一个读写缓冲区。从内存向磁盘输出数据时,必须先送到内存缓冲区, 装满缓冲区后才一起送到磁盘去。如果从向内存读入数据,则一次从磁盘文件 将一批数据输入到内存缓冲区,然后再从内存缓冲区逐个地将数据送到程序数 据区(变量) 内存 输入输入缓冲区 输入(读) 外存 程序数据区 文件 输出输出缓冲区 输出(写) 坛htp/www.elecfans.com电子发 3/31
http://bbs.elecfans.com 电子技术论 坛 http://www.elecfans.com 电子发 烧友 二、文件系统 3 / 31 在C语言中,根据操作系统对文件的处理方式的不同,把文件系统分为缓冲 文件系统和非缓冲文件系统。ANSI C标准采用缓冲文件系统。 缓冲文件系统(又称标准I/O)是指操作系统在内存中为每一个正在使用的文 件开辟一个读写缓冲区。从内存向磁盘输出数据时,必须先送到内存缓冲区, 装满缓冲区后才一起送到磁盘去。如果从向内存读入数据,则一次从磁盘文件 将一批数据输入到内存缓冲区,然后再从内存缓冲区逐个地将数据送到程序数 据区(变量)。 (第6章 文 件) 文件 外存 程序数据区 输入缓冲区 输出缓冲区 输入 输出 输出(写) 输入(读) 内 存 §6.1 文件概述
§6.1文件概述 (第6章文件) 缓冲文件系统解决了高速CPU与低速外存之间的矛盾,使用它延长了外存的 使用寿命,也提高了系统的整体效率。 非缓冲文件系统(又称系统I/0)是指系统不自动开辟确定大小的内存缓冲区, 而由程序自己为每个文件设定缓冲区。 标准I/O与系统Ⅰ/0分别采用不同的输入输出函数对文件进行操作。由于ANSI C只采用缓冲文件系统,因此本章所讲的函数也只是处理标准I/0的函数 三、文件分类 1、从用户角度分类 从用户的角度文件分为标准设备文件和普通磁盘文件 (1)标准设备文件:是指与主机相连的各种外部设备,如显示器、打印机、键 盘等。在操作系统中,把外部设备也看作是一个文件来进行管理,把它们的输 入、输出等同于对磁盘文件的读和写 标准输入文件指针: stdin。如果指定从 stdin输入数据,就是键盘输入。 标准输出文件指针: stdout。如果指定 stdout输出数据,就是屏幕等输出 标准错误输出文件指针: stderr。标准错误输出也是从屏幕终端输出 (2)普通磁盘文件:本章所讲的文件主要针对磁盘文件 3鼬;es粤术詮εε8888脂 坛htp/www.elecfans.com电子发 4/31
http://bbs.elecfans.com 电子技术论 坛 http://www.elecfans.com 电子发 烧友 三、文件分类 4 / 31 (第6章 文 件) 缓冲文件系统解决了高速CPU与低速外存之间的矛盾,使用它延长了外存的 使用寿命,也提高了系统的整体效率。 非缓冲文件系统(又称系统I/O)是指系统不自动开辟确定大小的内存缓冲区, 而由程序自己为每个文件设定缓冲区。 标准I/O与系统I/O分别采用不同的输入输出函数对文件进行操作。由于ANSI C只采用缓冲文件系统,因此本章所讲的函数也只是处理标准I/O的函数。 1、从用户角度分类 从用户的角度文件分为标准设备文件和普通磁盘文件。 ⑴标准设备文件:是指与主机相连的各种外部设备,如显示器、打印机、键 盘等。在操作系统中,把外部设备也看作是一个文件来进行管理,把它们的输 入、输出等同于对磁盘文件的读和写。 标准输入文件指针:stdin。如果指定从stdin输入数据,就是键盘输入。 标准输出文件指针:stdout。如果指定stdout输出数据,就是屏幕等输出。 标准错误输出文件指针:stderr。标准错误输出也是从屏幕终端输出。 ⑵普通磁盘文件:本章所讲的文件主要针对磁盘文件。 §6.1 文件概述
§6.1文件概述 (第6章文件) 2、按文件的编码方式分类 从文件的编码方式看,C文件分为ASCI文件和二进制文件 (1) ASCII文件(也称文本文件): ASCII文件在磁盘中存放时,每个字符对应 字节,用于存放对应的ASCⅠ码。如:整型十进制数12345,按 ASCII文件存放 则需要占用5个字节。可在屏幕上显示,但占用空间较大,读写操作要转换。 (2)二进制文件:是对不同的数据类型,按其实际占用内存字节数存放。即内 存的存储形式,原样输出到磁盘上存放。如:整型十进制数12345,按二进制文 件存放只需要2个字节。屏幕显示为乱码,但占用空间小,读写操作效率高。 ASCI文件形式 内存存储形式转换|0010010100101001010010001010 1(49)2(50)3(51)4(52)5(53) 0011000000111001 整数:12345直接00101001 二进制文件形式 坛htp/www.elecfans.com电子发 5/31
http://bbs.elecfans.com 电子技术论 坛 http://www.elecfans.com 电子发 烧友 2、按文件的编码方式分类 5 / 31 (第6章 文 件) 从文件的编码方式看,C文件分为ASCII文件和二进制文件。 ⑴ASCII文件(也称文本文件):ASCII文件在磁盘中存放时,每个字符对应一 个字节,用于存放对应的ASCII码。如:整型十进制数12345,按ASCII文件存放 则需要占用5个字节。可在屏幕上显示,但占用空间较大,读写操作要转换。 ⑵二进制文件:是对不同的数据类型,按其实际占用内存字节数存放。即内 存的存储形式,原样输出到磁盘上存放。如:整型十进制数12345,按二进制文 件存放只需要2个字节。屏幕显示为乱码,但占用空间小,读写操作效率高。 00110000 00111001 00110000 00111001 00110001 00110010 00110011 00110100 00110101 ASCII文件形式 二进制文件形式 内存存储形式 整数:12345 1(49) 2(50) 3(51) 4(52) 5(53) 转换 直接 §6.1 文件概述
§6.2文件类型指针 (第6章文件) 、文件指针 要调用磁盘上的一个文件时,必须知道与该文件有关的信息。比如文件名、 文件的当前读写位置、文件缓冲区大小与位置、文件的操作方式等。这些信息 被C语言系统保存在一个称作FILE的结构体中,它在 stdio.h头文件中定义内。 FILE结构体的内容为(在使用文件操作时,一般不用关心FILE内部成员信息): typedef struct I int level /*缓冲区“满”或“空”的程度*/ unsigned flags /米文件状态标志 char fd /*文件描述符* unsigned char hold: /*如无缓冲区不读取字符* int bsize: /*缓冲区大小*/ unsigned char* buffer;/米数据缓冲区位置* unsigned char *curp /*文件定位指针* unsigned 1 stemp /*临时文件指示器*/ short token /*用于有效性检查*/ FFILE 坛htp/www.elecfans.com电子发 6/31
http://bbs.elecfans.com 电子技术论 坛 http://www.elecfans.com 电子发 烧友 一、文件指针 6 / 31 要调用磁盘上的一个文件时,必须知道与该文件有关的信息。比如文件名、 文件的当前读写位置、文件缓冲区大小与位置、文件的操作方式等。这些信息 被C语言系统保存在一个称作FILE的结构体中,它在stdio.h头文件中定义内。 FILE结构体的内容为(在使用文件操作时,一般不用关心FILE内部成员信息): typedef struct { int level; /*缓冲区“满”或“空”的程度*/ unsigned flags; /*文件状态标志*/ char fd; /*文件描述符*/ unsigned char hold; /*如无缓冲区不读取字符*/ int bsize; /*缓冲区大小*/ unsigned char *buffer; /*数据缓冲区位置*/ unsigned char *curp; /*文件定位指针*/ unsigned istemp; /*临时文件指示器*/ short token; /*用于有效性检查*/ }FILE; (第6章 文 件) §6.2 文件类型指针
§6.2文件类型指针 (第6章文件) 文件指针(续) 有了结构体FILE类型后,可以用它来定义若干个FILE类型的变量,以便存放 若干个文件的信息。如:FIEf[5];定义了一个结构体数组f,它有5个元素 可以用来存放5个文件的信息。 对于每一个要操作的文件,都必须定乂一个指针变量,并使它指向该文件结 构体变量,这个指针称为文件指针。通过文件指针找到被操作文件的描述信息, 就可对它所指的文件进行各种操作。定义文件指针的一般形式为: FILE*指针变量标识符 如:FIE*fp;表示fp是一个指向FILE类型结构体的指针变量。可以使f指 向某一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该 文件。 如果有n个文件,一般应定义n个FILE类型的指针变量,使它们分别指向n个 文件所对应的结构体变量。 如:FILE*fp1,*fp2,*fp2,*fp4;可以处理4个文件 注意:FIE是用 typedef声明的文件信息结构体的别名,由C系统定义,用 户只能使用,不能修改,并且FILE必须大写 坛htp/www.elecfans.com电子发 7/31
http://bbs.elecfans.com 电子技术论 坛 http://www.elecfans.com 电子发 烧友 文件指针(续): 7 / 31 有了结构体FILE类型后,可以用它来定义若干个FILE类型的变量,以便存放 若干个文件的信息。如:FILE f[5]; 定义了一个结构体数组f,它有5个元素 可以用来存放5个文件的信息。 对于每一个要操作的文件,都必须定义一个指针变量,并使它指向该文件结 构体变量,这个指针称为文件指针。通过文件指针找到被操作文件的描述信息, 就可对它所指的文件进行各种操作。定义文件指针的一般形式为: FILE * 指针变量标识符; 如:FILE *fp; 表示fp是一个指向FILE类型结构体的指针变量。可以使fp指 向某一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该 文件。 如果有n个文件,一般应定义n个FILE类型的指针变量,使它们分别指向n个 文件所对应的结构体变量。 如:FILE *fp1 , *fp2 , *fp2 , *fp4; 可以处理4个文件。 注意:FILE是用typedef声明的文件信息结构体的别名,由C系统定义,用 户只能使用,不能修改,并且FILE必须大写。 (第6章 文 件) §6.2 文件类型指针
§6.3文件操作的相关函数 (第6章文件) 对文件的操作一般步骤包括:打开文件、读或写文件、关闭文件。在C语言 中,文件操作都是由库函数来完成的。这些库函数包含在 stdio.h头文件中。 、文件的打开与关闭 所谓打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文 件,以便进行其它各种操作。关闭文件则是断开指针与文件之间的联系,也就 禁止再对该文件进行操作, 1、文件的打开( fopen函数 ANSIC规定了标准输入输岀函数库,用 fopen(函数来实现打开文件。 fopen 函数的原型为:FILE* fopen(char*fi1 ename,char*mode 其中参数 filename表示一个文件名,是用双引号括起来的字符串,这个字符串 可以是一个合法的带有路径的文件名。参数mode表示对文件的操作模式,mode 的值仍需要用双引号括起来,mode的取值及其含义详见教P×××的表6.1。 如:FIEL*fpl;fpl- fopen(test.c”,”"r3);表示是在当前目录下打开文件 test.C,只允许进行“读”操作,并使fp指向该文件 再如:FIEL*fp2;fp2= fopen(c:\ tt\test.exe”,”rb”);表示打开C盘下 tt目录中的test.exe文件,是二进制文件,只允许按二进制方式进行读操作。 3鼬;es粤术詮εε8888脂 坛htp/www.elecfans.com电子发 8/31
http://bbs.elecfans.com 电子技术论 坛 http://www.elecfans.com 电子发 烧友 (第6章 文 件) 8 / 31 对文件的操作一般步骤包括:打开文件、读或写文件、关闭文件。在C语言 中,文件操作都是由库函数来完成的。这些库函数包含在stdio.h头文件中。 一、文件的打开与关闭 所谓打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文 件,以便进行其它各种操作。关闭文件则是断开指针与文件之间的联系,也就 禁止再对该文件进行操作。 1、文件的打开(fopen函数) ANSIC规定了标准输入输出函数库,用fopen()函数来实现打开文件。fopen 函数的原型为: FILE *fopen(char *filename,char *mode) 其中参数filename表示一个文件名,是用双引号括起来的字符串,这个字符串 可以是一个合法的带有路径的文件名。参数mode表示对文件的操作模式,mode 的值仍需要用双引号括起来,mode的取值及其含义详见教材P×××的表6.1。 如:FIEL *fp1; fp1=fopen(“test.c” , ”r”); 表示是在当前目录下打开文件 test.c,只允许进行“读”操作,并使fp指向该文件。 再如:FIEL *fp2; fp2=fopen(“c:\\tt\\test.exe” , ”rb”); 表示打开C盘下 tt目录中的test.exe文件,是二进制文件,只允许按二进制方式进行读操作。 §6.3 文件操作的相关函数
§6.3文件操作的相关函数 (第6章文件) 文件使用方式及其意义 ASCII 只读 r 打开一个已经存在的文本文件 文件只写 建立并打开一个文本文件 操作 追加 a 打开或建立一个文本文件,在末尾写入 二进制匚只读打开一个已经存在的三进制文件 文件|只写 b建立并打开一个二进制文件 操作 追加 ab打开或建立一个二进制文件,在末尾写入 ASCII 读写r+打开一个已经存在的文本文件 文件读写w+建立并打开一个文本文件 操作读写a打开或建立一个文本文件,在末尾写入 二进制 读写tb+打开一个已经存在的二进制文件 文件读写wb+建立并打开一个三进制文件 操作读写十ab+打开或建立一个三进制文件,在末尾写入 3ε/咔印sq嘟术診888εεε8量量 坛htp/www.elecfans.com电子发 9/31
http://bbs.elecfans.com 电子技术论 坛 http://www.elecfans.com 电子发 烧友 文件使用方式及其意义 9 / 31 (第6章 文 件) ASCII 文件 操作 ASCII 文件 操作 二进制 文件 操作 二进制 文件 操作 只读 只读 只写 追加 只写 追加 读写 读写 读写 读写 读写 读写 r w a r+ w+ a+ rb wb ab rb+ wb+ ab+ 打开一个已经存在的文本文件 打开一个已经存在的二进制文件 建立并打开一个文本文件 打开或建立一个文本文件,在末尾写入 建立并打开一个二进制文件 打开或建立一个二进制文件,在末尾写入 打开一个已经存在的文本文件 打开一个已经存在的二进制文件 建立并打开一个文本文件 打开或建立一个文本文件,在末尾写入 建立并打开一个二进制文件 打开或建立一个二进制文件,在末尾写入 §6.3 文件操作的相关函数
§6.3文件操作的相关函数 (第6章文件) 2、文件的关闭 fclose函数) colse函数的原型为: int fclose(FIle*fp) 功能:使文件指针变量与文件“脱钩”,释放文件结构体和文件指针。 返回值:关闭成功时返回0。否则(如磁# include 盘空间不足、写保护或关闭已经关闭的文 mainO 件)返回EOF,即-1。 R FILE fp; 特别注意,文件使用完后,一定要关闭fp= -fopen(“ 'test. txt?,w”); 文件,否则可能丢失数据。因为在关闭之if(fp=NULL) 前,首先将缓冲区的数据输出到磁盘文件{ printf("file open error!in”); 中,然后再释放文件指针变量。 exit(0);/终止程序 程序中的exit函数原型为: void exit(int status) else 功能:终止程序。它将 status的值发送给{ printf(file open OK!m); D0S环境变量。它在 stdlib.h中声明。 fclose(tp); 坛htp/www.elecfans.com电子发 10/31
http://bbs.elecfans.com 电子技术论 坛 http://www.elecfans.com 电子发 烧友 2、文件的关闭(fclose函数) 10 / 31 fcolse函数的原型为: int fclose(FILE *fp) 功能:使文件指针变量与文件“脱钩”,释放文件结构体和文件指针。 (第6章 文 件) #include main() { FILE * fp; fp=fopen(“test.txt”,”w”); if (fp==NULL) { printf(“file open error! \n”); exit(0); /*终止程序*/ } else { printf(“file open OK! \n); fclose(fp); } } 返回值:关闭成功时返回0。否则(如磁 盘空间不足、写保护或关闭已经关闭的文 件)返回EOF,即-1。 特别注意,文件使用完后,一定要关闭 文件,否则可能丢失数据。因为在关闭之 前,首先将缓冲区的数据输出到磁盘文件 中,然后再释放文件指针变量。 程序中的exit函数原型为: void exit(int status) 功能:终止程序。它将status的值发送给 DOS环境变量。它在stdlib.h中声明。 §6.3 文件操作的相关函数