
第十三章文件.ppt
23页第十三章 文 件•掌掌握握文文件件以以及及缓缓冲冲文文件件系系统统、、文文件件指指针针的的概念;概念;•学学会会使使用用文文件件打打开开、、关关闭闭、、读读、、写写等等文文件件操作函数操作函数 §13.1 §13.1 C文件概述文件概述 一、文件的概念一、文件的概念 文件:文件:是指存储在外部介质上数据的集合是指存储在外部介质上数据的集合 操作系统是以文件为单位对数据进行管理操作系统是以文件为单位对数据进行管理的每一个与主机相连的输入或输出设备都看的每一个与主机相连的输入或输出设备都看作是一个文件作是一个文件 二、文件的存在形式及分类二、文件的存在形式及分类 文件的存在形式文件的存在形式:文件名:文件名+文件内容文件内容 文件内容文件内容::是一个字符是一个字符(字节字节)序列,即由一个个字序列,即由一个个字符符 (字节字节)的数据顺序组成对文件的存取是以的数据顺序组成对文件的存取是以字字 符符(字节字节)为单位的,这类文件称为为单位的,这类文件称为流式文件流式文件 文件的分类文件的分类::⑴⑴ASCII ASCII 码文件码文件( (文本文件文本文件) ):文件的每一个字节放:文件的每一个字节放 一个一个ASCII代码,代表一个字符。
代码,代表一个字符 ⑵⑵二进制文件二进制文件 :把内存中的数据按其在内存中的存:把内存中的数据按其在内存中的存 储形式原样输出到文件上储形式原样输出到文件上 根据数据在内存的组织形式不同可分为两类文件根据数据在内存的组织形式不同可分为两类文件∶ ∶ ASCII 码文件(文本文件)码文件(文本文件) 二进制文件二进制文件 根据数据读写方式不同可分为两类文件根据数据读写方式不同可分为两类文件∶ ∶ 顺序存取文件顺序存取文件 随机存取文件随机存取文件 三、文件的基本操作三、文件的基本操作 (1) 打开文件打开文件∶ ∶把文件名等目录信息从磁盘上读把文件名等目录信息从磁盘上读(2) 入内存并存入结构体入内存并存入结构体⑵⑵ 关闭文件关闭文件∶ ∶把内存结构体中的文件名等目录把内存结构体中的文件名等目录 信息写入磁盘信息写入磁盘。
3) 写文件写文件∶ ∶ 向文件写内容向文件写内容 (4) 读文件读文件∶ ∶ 从文件读内容从文件读内容 四、四、 文件的输入输出方式文件的输入输出方式 C语言对文件进行处理分为:语言对文件进行处理分为: 非缓冲文件系统非缓冲文件系统 缓冲文件系统缓冲文件系统⑴⑴非缓冲文件系统非缓冲文件系统∶ ∶程序与外设直接进行数据交换程序与外设直接进行数据交换 特点特点∶ ∶每读写一次都要启动外设每读写一次都要启动外设 ⑵⑵缓冲文件系统缓冲文件系统∶ ∶程序与外设通过内存缓冲区进行程序与外设通过内存缓冲区进行 数据交换常用的方式)数据交换常用的方式) 特点特点∶ ∶只有内存缓冲区满只有内存缓冲区满(写盘写盘)或空或空(读盘读盘)才才 启动外设启动外设 程序程序数据区数据区输出文件输出文件缓冲区缓冲区输入文件输入文件缓冲区缓冲区磁盘磁盘§13.2 §13.2 C文件类型指针文件类型指针一、一、文件类型文件类型((FILE)) 每个被使用的文件都在内存中开辟一个区,每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件名,状态,当用来存放文件的有关信息(如文件名,状态,当前位置等)。
这些信息保存在一个结构体类型的前位置等)这些信息保存在一个结构体类型的变量中结构体类型由系统定义为变量中结构体类型由系统定义为“FILE” 有的有的C版本在版本在 stdio.h文件中有如下定义:文件中有如下定义:typedef struct{ int _fd;;; /* 文件号文件号 */ int _cleft;; /* 缓冲区中剩下的字符缓冲区中剩下的字符 */ int _mode;; /* 文件操作模式文件操作模式 */ char *_nexttc; /* 下一个字符位置下一个字符位置 */ char *_buff; /* 文件缓冲区位置文件缓冲区位置 */ }FILE;二、定义二、定义FILE类型指针变量类型指针变量 FILE 类型的指针变量定义方法类型的指针变量定义方法∶ ∶ FILE *指针变量名指针变量名;例如:例如:FILE *fp;含义:含义:fp是一个指向是一个指向FILE类型结构体的指针变量类型结构体的指针变量。
可以使可以使fpfp指向某个文件的结构体变指向某个文件的结构体变量,从而通过该结构体变量中的文件信量,从而通过该结构体变量中的文件信息能够访问该文件息能够访问该文件 §13.3 §13.3 文件的打开和关闭函数文件的打开和关闭函数 一、文件的打开函数(一、文件的打开函数(fopen函数)函数) (1) 调用方式调用方式:: FILE *fp ;fp= fopen(文件名,文件的使用方式);所要打开的文件名所要打开的文件名必须是用双引号引必须是用双引号引起的字符串常量起的字符串常量 具有特定含意的符号具有特定含意的符号也必须也必须 由双引号引起由双引号引起用户定义的文件类型指针变量用户定义的文件类型指针变量⑵⑵功能功能:以指定的方式打开指定的文件,若操作:以指定的方式打开指定的文件,若操作 成功,则返回一个指向该文件的指针,若打成功,则返回一个指向该文件的指针,若打 开文件时出现错误,则返回空指针开文件时出现错误,则返回空指针NULL 例例∶ ∶ FILE *fp; fp=fopen("stu.dat","r");⑶⑶文件使用方式文件使用方式 •基本方式字符(单独使用是对文本文件):基本方式字符(单独使用是对文本文件): r 仅为读而打开。
仅为读而打开 ( (只读文件只读文件) ) w 仅为写而打开仅为写而打开 ( (建立新文件建立新文件) ) a 仅为添加而打开仅为添加而打开 (写旧文件写旧文件) ) •按二进制格式读写文件(基本方式字符按二进制格式读写文件(基本方式字符+“b”)∶ ∶ b 辅助说明,按二进制格式读写文件辅助说明,按二进制格式读写文件 •同时进行读写文件(基本方式字符同时进行读写文件(基本方式字符+[“b”]+“+”)∶ ∶ + 辅助说明,可同时进行读和写文件辅助说明,可同时进行读和写文件 例如:例如:fp=(“stu.dat”,“rb”);例如:例如:fp=(“stu.dat”,“r+”);⑶⑶文件使用方式文件使用方式 •基本方式字符(单独使用是对文本文件):基本方式字符(单独使用是对文本文件): r 仅为读而打开仅为读而打开 ( (只读文件只读文件) ) w 仅为写而打开仅为写而打开 ( (建立新文件建立新文件) ) a 仅为添加而打开仅为添加而打开 (写旧文件写旧文件) ) •按二进制格式读写文件(基本方式字符按二进制格式读写文件(基本方式字符+“b”)∶ ∶ b 辅助说明,按二进制格式读写文件。
辅助说明,按二进制格式读写文件 •同时进行读写文件(基本方式字符同时进行读写文件(基本方式字符+[“b”]+“+”)∶ ∶ + 辅助说明,可同时进行读和写文件辅助说明,可同时进行读和写文件 例如:例如:fp=(“stu.dat”,“rb”);例如:例如:fp=(“stu.dat”,“r+”);⑶⑶文件使用方式文件使用方式 •基本方式字符(单独使用是对文本文件):基本方式字符(单独使用是对文本文件): r 仅为读而打开仅为读而打开 ( (只读文件只读文件) ) w 仅为写而打开仅为写而打开 ( (建立新文件建立新文件) ) a 仅为添加而打开仅为添加而打开 (写旧文件写旧文件) ) •按二进制格式读写文件(基本方式字符按二进制格式读写文件(基本方式字符+“b”)∶ ∶ b 辅助说明,按二进制格式读写文件辅助说明,按二进制格式读写文件 •同时进行读写文件(基本方式字符同时进行读写文件(基本方式字符+[“b”]+“+”)∶ ∶ + 辅助说明,可同时进行读和写文件辅助说明,可同时进行读和写文件 例如:例如:fp=(“stu.dat”,“rb”);例如:例如:fp=(“stu.dat”,“r+”);例:例:#include
常使用此方法打常使用此方法打开一个文件开一个文件exit函数的功能是关闭所函数的功能是关闭所有文件,终止程序运行有文件,终止程序运行exit(0)为正常终止程序为正常终止程序二、文件的关闭函数(二、文件的关闭函数(fclose函数)函数) (1) 调用方式调用方式:: fclosefclose( (文件指针文件指针) );; ⑵⑵ 功能功能:关闭由文件指针指定的文件,把缓冲区:关闭由文件指针指定的文件,把缓冲区 中的数据(未装满缓冲区的数据)输出中的数据(未装满缓冲区的数据)输出 到磁盘上,释放文件指针到磁盘上,释放文件指针例如:例如: FILE *fp; fp=fopen(“output.dat”,“r+”);; …… /* 进行读写操作进行读写操作 */ fclose(fp);注意:注意:fopen函数和函数和fclose函数总是成对出现的函数总是成对出现的 无无fclose函数时会导致部分数据丢失!函数时会导致部分数据丢失!2. 2. fgetcfgetc函数函数一般调用形式:一般调用形式: 字符变量字符变量= =fgetcfgetc( (文件指针文件指针); ); 功能:从文件指针所指文件中读一个字符赋给指功能:从文件指针所指文件中读一个字符赋给指 定的字符变量。
当遇文件结束符,返回一定的字符变量当遇文件结束符,返回一 个文件结束标志个文件结束标志EOF((-1)例如:例如:ch=fgetc(fp); 其中其中ch为字符变量,为字符变量,fp为文件指针为文件指针 含义:从含义:从fp所指向的文件中读入一个字符赋所指向的文件中读入一个字符赋 给字符变量给字符变量ch例例: 阅读程序阅读程序 #include "stdio.h" #define NULL 0 main() { FILE *fp; int count=0; char c; if((fp=fopen(“file.txt”,“r”))))==NULL)) { printf(“Can’t Open File \n”); exit(0); } c=fgetc(fp); while(c!=EOF) { count++; c=fgetc(fp); } printf(“count=%d\n”,count); fclose(fp); }若文件若文件file.txt的内容是的内容是: abcd1234ABCD输出结果:输出结果: 12这是读一个文本文件这是读一个文本文件中字符,并判断文件中字符,并判断文件是否结束的常用方法是否结束的常用方法 关于文件读写状态的检测关于文件读写状态的检测 检测函数调用是否成功,可有两种手段来检测:检测函数调用是否成功,可有两种手段来检测:1. 由函数的返回值来确定由函数的返回值来确定2. 用文件状态检测函数用文件状态检测函数feof、、ferror、、fclearerrfeof(fp) :测试测试fp所指向的文件的位置是否是文件所指向的文件的位置是否是文件 尾。
若已达到文件尾,函数返回非零值,尾若已达到文件尾,函数返回非零值, 否则返回否则返回0常用程序段:常用程序段:while(!feof(fp))……ferror(fp) :测试对测试对fp所指向的文件的操作是否出所指向的文件的操作是否出 错若出错,函数返回非零值,否则错若出错,函数返回非零值,否则 返回返回0fclearerr(fp) :使使ferror和和feof函数值置函数值置0二、二、 fread函数和函数和fwrite函数函数 一般调用形式:一般调用形式: fread(buffer,size,count,fp); fwrite(buffer,size,count,fp); 其中:其中:buffer:是一个指针是起始地址)是一个指针是起始地址) 对对fread来说,它是读入数据的存放地址来说,它是读入数据的存放地址 对对fwrite来说,它是输出数据的地址来说,它是输出数据的地址size :要读写的字节数要读写的字节数 count:要进行读写多少个要进行读写多少个size字节的数据项。
字节的数据项 功能:功能:对对fp所指的文件读写所指的文件读写buffer所指的所指的size*count 个字节数据个字节数据 例如:例如:fread(f,4,2,fp); (其中其中f是实型数组名是实型数组名)例例1 把数组把数组a写入文件写入文件fa;再从再从fa读入数组读入数组b #include "stdio.h" main(){ FILE* fp; int a[100]={1,5,6,78,21,34,67,87,23},b[100], i ; fp=fopen("tmp","wb"); fwrite(a,sizeof(a),1,fp); /* fwrite(a,sizeof(int),100,fp);*/ fclose(fp); fp=fopen("tmp","rb"); fread(b,sizeof(a),1,fp); for(puts(""),i=0;i<10;i++)printf("%6d",b[i]); fclose(fp);}四、四、 fputs函数函数 和和fgets函数函数 这两个函数是以字符串为单位进行文件读写的函数。
这两个函数是以字符串为单位进行文件读写的函数一般调用形式:一般调用形式: fputsfputs( (字符串字符串, ,文件指针文件指针);); 1. fputs函数函数功能:向指定文件输出一个字符串功能:向指定文件输出一个字符串例如:例如:fputs(str,fp); (其中其中str是字符数组名是字符数组名)含义:向含义:向fp 所指向的文件中输出所指向的文件中输出str中的字符串中的字符串2. fgets函数函数fgetsfgets( (字符串字符串, ,字符串长度字符串长度, ,文件指针文件指针);); 功能:从指定文件中读入一个字符串功能:从指定文件中读入一个字符串 例如:例如:fgets(str,n,fp); (其中其中str是字符数组名是字符数组名)含义:从含义:从fp指向的文件读取长度为指向的文件读取长度为n-1的字符串,的字符串, 最后加一个最后加一个‘\0’存入字符数组存入字符数组str中调用形式:调用形式: 三、三、 fprintf 函数和函数和fscanf函数函数 这两个函数是进行格式读写文件的函数这两个函数是进行格式读写文件的函数 。
一般调用形式:一般调用形式: fprintf(文件指针,格式字符串,输出表列)文件指针,格式字符串,输出表列); fscanf(文件指针,格式字符串,输入表列文件指针,格式字符串,输入表列) ; 例如:例如:fprintf(fp,“%d,%6.2f”,i,x);功能:按指定格式将数据写到指定文件中功能:按指定格式将数据写到指定文件中 或从指定文件按格式输入数据或从指定文件按格式输入数据又如:又如:fscanf(fp,“%d,%f”,&i,&x);功能:把文件的读写位置指针移到指定的位置功能:把文件的读写位置指针移到指定的位置 例如:例如:fseek(fp,128L,SEEK_SET); 将位置指针移到离文件头将位置指针移到离文件头128个字节处个字节处例如:例如:fseek(fp,-10L,2); 将位置指针从文件末尾处向后退将位置指针从文件末尾处向后退10个字节注意:注意:fseek函数一般用于二进制文件函数一般用于二进制文件 3. ftell函数函数 一般调用形式:一般调用形式: ftellftell( (文件指针文件指针);); 功能:返回文件位置指针的当前值。
功能:返回文件位置指针的当前值例如:例如:pos=ftell(fp); 获取获取fp指向文件的当前读写位置,并将其值指向文件的当前读写位置,并将其值 赋给变量赋给变量pos 作业:作业:1. 编写并上机调试编写并上机调试12.4(仅实现循环左移)仅实现循环左移)3. 思考题:思考题:13.1、、13.2、、13 .32. 编写并上机调试编写并上机调试13.6五、文件的定位函数五、文件的定位函数 1. rewind函数函数一般调用形式:一般调用形式: rewind(rewind(文件指针文件指针);); 功能:使位置指针重新返回文件的开头功能:使位置指针重新返回文件的开头2. fseek函数函数 一般调用形式:一般调用形式: fseekfseek( (文件指针文件指针,位移量,起始点,位移量,起始点) );; 起始点:用起始点:用0、、1、、2或其对应的名字或其对应的名字SEEK_SET、、 SEEK_CUR、、SEEK_END代替,分别表代替,分别表 示文件开始、文件当前位置、文件末尾。
示文件开始、文件当前位置、文件末尾 位移量:指以起始点为基点,向前(位移量:指以起始点为基点,向前(-)或向后移动的)或向后移动的 字节数ANSI C标准规定在数字末尾加一个标准规定在数字末尾加一个 字母字母L,,表示表示long型。












