《C语言程序设计》第十章文件课件.ppt

上传人(卖家):三亚风情 文档编号:3367766 上传时间:2022-08-24 格式:PPT 页数:50 大小:248KB
下载 相关 举报
《C语言程序设计》第十章文件课件.ppt_第1页
第1页 / 共50页
《C语言程序设计》第十章文件课件.ppt_第2页
第2页 / 共50页
《C语言程序设计》第十章文件课件.ppt_第3页
第3页 / 共50页
《C语言程序设计》第十章文件课件.ppt_第4页
第4页 / 共50页
《C语言程序设计》第十章文件课件.ppt_第5页
第5页 / 共50页
点击查看更多>>
资源描述

1、1第十章第十章 文文 件件10.1 C文件概述文件概述10.2 文件的打开与关闭函数文件的打开与关闭函数10.3 文件的读文件的读/写函数写函数10.4 文件处理的其它常用函数文件处理的其它常用函数10.5 文件应用程序设计举例文件应用程序设计举例2文文 件件 概概 述述一、文件的概念和分类:一、文件的概念和分类:文件:一个存储在外部介质上的数据的集合。文件:一个存储在外部介质上的数据的集合。数据文件数据文件-如果文件中存放的都是数据。程序文件程序文件-如果文件中存放提源程序清单或是编绎连接后成的可执行文件。磁盘文件磁盘文件-存放在磁盘上,关闭计算机后文件仍存在,下次开机,可以从磁盘文件中读取

2、数据。1、文件名:能唯一标织某个磁盘文件的就是磁盘文件名磁盘文件名。盘文件名的一般组成:盘符:路径盘文件名的一般组成:盘符:路径文件主名文件主名.扩展名,扩展名,文件主名是由字母开头的字母数字等字符组成的,长度8个字符。扩展名也是由字母开头的字母数字等字符组成的,长度3个字符。32、磁盘文件的打开与关闭通常把从磁盘文件中读取数据到内存称为“文件的打开文件的打开”;把内存中的数据存回到磁盘文件称为“文件的关闭”。使用文件要先打开,使用后,必须关闭。3、缓冲文件系统和非缓冲文件系统缓冲文件系统缓冲文件系统:系统自动设定缓冲区,随着一个文件夹的打开,自动设置一段内存区域作为这个文件的缓冲区。非缓冲文

3、件系统非缓冲文件系统:系统不自动设置缓冲区,要求用户在程序中的打开的文件设置缓冲区。这个内存区是磁盘文件和程序中存放数据的变量、数组之间交换数据的缓冲区域,称为“文件缓冲区文件缓冲区”。44、磁盘文件的分类按数据格式分类:二进制文件、文本文件二进制文件、文本文件按读写方式分类:顺序文件、随机文件顺序文件、随机文件5、设备文件输入/输出设备也看成文件,称为设备文件。常用输入设备是键盘,称标准输入设备;常用输出设备是显示器,称标准输出设备;还有一个专用于输出错误信息的标准错误输出设备,也是指显示器。从输入设备上读取数据,可以看成是从输入设备文件中读取数据;将数据写到输出设备上,可以看成是写到输出设

4、备文件中。5C语言规定,对上述三种标准的输入/输出设备进行数据的读写操作,不必事先打开设备文件,操作后,也可不必关闭设备文件。二、文件型指针二、文件型指针C语言规定文件类型是一种特殊的“结构型结构型”。对这个结构类型,系统已经在名为“stdio.h”的头文件中按下列格式进行了定义:typedef struct int _fd;int _cleft;int _mode;char*nextc;char*buff;FILE;6用“FILE”定义的指针变量通常称为“文件型指针文件型指针”,是专用于文件处理的。文件型指针的定义方法如下:FILE*文件型指针名文件型指针名1,*文件型指针名文件型指针名2,

5、.;其中的“文件型指针名文件型指针名”是用户选取的标识符。7文件的打开与关闭函数文件的打开与关闭函数一、打开文件函数一、打开文件函数【函数头函数头】FILE*fopen(char*filename,char*mode)【参数参数】filename 字符型指针,指向的字符串是要打开的磁盘 文件名。mode 字符型指针,指向的字符串是文件使用的方 式。这两个参数对应的实参可以是字符串常量,也可以是字符数组首地址,或者是指向字符串的指针变量。8文件使用方式可以是下列字符串:r 打开一个已经存在的文本文件,只能读取数据。w 打开一个文本文件,只能写入数据。若文件不存在,则自动建立一个新文件接受写入数据

6、;若文件已存在,则删去旧文件,建立一个同名新文件,接受写入的数据。a 打开一个已存在的文本文件,只能写入数据并且追加 在文件尾部。“r+”打开一个已存在的文本文件,可以读取数据,也可以 写入数据。w+打开一个文本文件,可以读取数据,也可以写入数据。若文件不存在,则自动建立一个新文件接受写入数据;若文件已存在,则删去旧文件,建立一个同名新文件,接受写入的数据。a+打开一个已经存在的文本文件,可以读取数据,也可以 写数据到文件尾部。9rb 打开一个已经存在的二进制文件,只能读取数据。wb 打开一个二进制文件,只能写入数据。若文件不存在,则自动建立一个新文件接受写入数据;若文件已存在,则删去旧文件,

7、建立一个同名新文件,接受写入的数据。ab 打开一个已存在的二进制文件,只能写入数据并且追 加在文件尾部。rb+打开一个已存在的二进制文件,可以读取数据,也可 以写入数据。wb+打开一个二进制文件,可以读取数据,也可以写入数据。若文件不存在,则自动建立一个新文件接受写入数据;若文件已存在,则删去旧文件,建立一个同名新文件,接受写入的数据。ab+打开一个已经存在的二进制文件,可以读取数据,也可 以写数据到文件尾部。10【功能功能】以mode指定的“使用方式使用方式”,打开filename指定的“文件名文件名”对应的文件,同时自动给该文件分配一个内存缓冲区。【返回值返回值】能正确打开指定的文件,则返

8、回一个指向“文文件型变量件型变量”的地址;如果打开文件出现错误,返回值为“NULL”,表示打开文件错误。“NULL”代表空,其值为“0”。在文件打开之前,应该定义文件型指针,以便接受打开文件函数返回的地址。打开文件时,一般要对返回值进行判断,如果返回值为“NULL”,则表示文件打开出错,不能使用这个文件,应提示用户,并中止程序的运行。11二、关闭文件函数二、关闭文件函数【函数头函数头】int fclose(FILE*fp)【参数参数】fp 文件型指针,通过fopen()()函数获得的、已指向某个打开的文件。【功能功能】关闭fp所指向的文件,同时自动释放分配给 文件的内存缓冲区。【返回值返回值】

9、能正确关闭指定的文件,则返回0;否则返回非非0。12下面的程序说明了文件的打开与关闭的常用方式:#include stdio.h FILE*fp;.if(fp=fopen(文件名文件名,文件使用方式文件使用方式)=NULL)printf(file can not open!n);exit(0);.fclose(fp);13三、标准设备文件的打开与关闭三、标准设备文件的打开与关闭三种标准输入/输出设备的使用不必事先打开对应的设备文件,因为在系统启动后,已自动打开这三个设备文件,并且为它们各自设置了一个文件型指针,名称如下:标准设备名称 对应文件型指针名 标准输入设备(键盘)stdin 标准输出设

10、备(显示器)stdout 标准错误输出设备(显示器)stderr14文件的读文件的读/写函数写函数一、文件尾测试函数一、文件尾测试函数【函数头函数头】int feof(FILE*fp)【参数参数】fp 文件型指针,通过fopen()函数获得的,已指向某个打开文件。【功能功能】测试fp所指向的文件是否到达文件尾。是文件 尾返回非非0,否则返回0。【返回值返回值】若当前是文件尾,返回非非0,否则返回0。15二、字符读二、字符读/写函数写函数1、写字符函数【函数头函数头】int fputc(char ch,FILE*fp)【参数参数】ch 写到文件中的字符,可以是字符常量、字符 变量等。fp 文件型

11、指针,通过fopen()函数获得的、已 指向某个打开的可写文件。该文件可以是文本 文件,也可以是二进制文件。【功能功能】将ch中的字符写到fp所指向的文件的当前位置。【返回值返回值】正确,则返回刚写到文件中的字符;错误,则返 回EOF(符号常量,其值为1)。16例 1 从键盘输入10个字符,写到a盘根目录下名为“char2.txt”的文本文件中。程序清单如下:#include stdio.h main()FILE*fp;int i;char c;if(fp=fopen(a:char2.txt,w)=NULL)printf(file can not open!n);exit(0);for(i=0

12、;i10;i+)c=getchar();fputc(c,fp);fclose(fp);172、读字符函数【函数头函数头】int fgetc(FILE*fp)【参数参数】fp 文件型指针,通过fopen()函数获得的、已指向某个打开的可读文件。该文件可以 是文本文件、也可以是二进制文件。【功能功能】从fp所指向的文件当前位置读取单个字符。【返回值返回值】正确,则返回读取的单个字符;错误,则 返回EOF(1)。18例2 从a盘根目录下名为“char2.txt”的文本文件中读取前10个字符,依次显示在屏幕上。如果文本文件中不足10个字符,则有多少个字符读取并显示多少个字符。程序清单如下:#inclu

13、de stdio.hmain()FILE*fp;int i;char c;if(fp=fopen(a:char2.txt,r)=NULL)printf(file can not open!n);exit(0);19for(i=0;i10;i+)if(feof(fp)break;c=fgetc(fp);putchar(c);fclose(fp);例3 编一个函数完成文本文件的复制,源文件和目标文件名作为函数参数。函数清单如下:#include stdio.h void my_copy(fname1,fname2)char*fname1;char*fname2;20 FILE*fp1,*fp2;i

14、f(fp1=fopen(fname1,r)=NULL)printf(file can not open!n);exit(0);if(fp2=fopen(fname2,w)=NULL)printf(file can not open!n);exit(0);while(!feof(fp1)fputc(fgetc(fp1),fp2);fclose(fp1);fclose(fp2);return;21三、字符串读三、字符串读/写函数写函数读/写字符函数处理的文件类型是文本文件,读写的数据是以字符串的单位。1、写字符串函数【函数头函数头】int*fputs(char*str,FILE*fp)【参数参数】

15、str字符型指针,可以是字符串常量,或存放待输 出字符串的字符数组首地址,也可以是指向待输 出字符串的指针变量。fp文件型指针,通过fopen()函数获得的、已指向 打开的可写文本文件。【功能功能】将str指向的一个字符串,舍去结束标记0后写入 fp所指向的文件中。22【返回值返回值】正确,则返回写入文件的实际字符数;错误,则返回EOF(1)。例4 从键盘上读取3个字符串,依次写入a盘根目录下名为“string1.txt”的文本文件。程序清单如下:#include stdio.h main()FILE*fp;int i;char s13100,s23100;for(i=0;i3;i+)gets

16、(s1i);if(fp=fopen(a:string1.txt,w)=NULL)printf(file can not open!n);exit(0);23 for(i=0;i3;i+)fputs(s1i,fp);fclose(fp);2、读字符串函数【函数头函数头】char*fgets(char*str,int n,FILE*fp)【参数参数】str 字符型指针,可以是存放字符串的字符数组 首地址,也可以是指向某个能存放字符串的 内存区域的指针变量。n 整型,可以是整型常量、变量或表达式。fp 文件型指针,通过fopen()函数获得的、已指 向打开的可读文本文件。24【功能功能】从fp所指向

17、的文件当前位置读取n1个字符,在其后补充一个字符串结束标记0,组成字符串并存入str指定的内存区。如果读取的前n1个字符时有“回车符回车符”,则只读到回车符为止,补充结束标记0组成字符串(包括回车符),回车符后的字符将不再读取。如果读取的前n1个字符时遇到文件尾,则将读取的字符后面补充结束标记0组成字符串。【返回值】正确,则返回str对应的地址;错误,则返回NULL(0)。当正确地读取了1个字符串后,文件内部指针会自动后移1个字符串的位置。25例5 从a盘根目录下名为“string1.txt”的文本文件中读取一个字符串或前20个字符组成字符串,并显示在屏幕上。程序清单如下:#include s

18、tdio.h main()FILE*fp;char s21;if(fp=fopen(a:string1.txt,r)=NULL)printf(file can not open!n);exit(0);fgets(s,21,fp);fputs(s,stdout);fclose(fp);26 虽然可以使用以前介绍的puts()函数将字符串输出到显示器,但fputs()函数在输出时是舍弃了这个结束标记0。四、数据读四、数据读/写函数写函数 读写数据函数处理的文件类型主要是二进制文件,也可以是文本文件(数据是字符型)。读写的数据可以是字符型、整型、实型,也可以是结构型等。1、写数据函数【函数头函数头】

19、int fwrite(char*buf,unsigned size,unsigned n,FILE*fp)27【参数参数】buf 字符型指针,可以是存放数据的变量地址或数组 首地址,也可以是指向某个变量或数组的指针变 量。size 无符号整型,可以是整型常量、变量或表达式。代表写入文件的每个数据所占用的字节总数。通 常使用表达式“sizeof(数据类型符数据类型符)”。n 无符号整型,可以是整型常量、变量或表达式。代表写入文件的数据的个数(注意每个数据是 size个字节)。fp 文件型指针,通过fopen()函数获得的、已指向打 开的可写文件。28【功能功能】将buf指向的n个数据(每个数据的

20、字节数为size)写入fp指向的文件。【返回值返回值】正确,则返回n值;错误,则返回NULL(0)。当正确地写入文件n个数据后,文件内部指针会自动后移nsize个字节的位置。例6 从键盘上读取10个整型数据,写入a盘根目录下名为“intb1.dat”的二进制数据文件中。程序清单如下:29#include stdio.h main()FILE*fp;int a10,*p=a;if(fp=fopen(a:intb1.dat,wb)=NULL)printf(file can not open!n);exit(0);while(pa+10)scanf(%d,p+);fwrite(a,sizeof(in

21、t),10,fp);fclose(fp);302、读数据函数【头函数头函数】int fread(char*buf,unsigned size,unsigned n,FILE*fp)【参数参数】buf 字符型指针,可以是存放数据的变量地址或数组 首地址,也可以是指向某个变量或数组的指针变 量。size 无符号整型,可以是整型常量、变量或表达式。代表读取文件的每个数据所占用的字节总数。通 常使用表达式“sizeof(数据类型符数据类型符)”。n 无符号整型,可以是整型常量、变量或表达式。代表读取文件的数据(size个字节)的个数。fp 文件型指针,通过fopen()函数获得的、已指向打 开的可读文

22、件。31【功能功能】从fp所指向的文件当前位置读取n个数据,每个数据的 字节数为size,共组成n个长度为size的数据存入but指 定的内存区。【返回值返回值】正确,则返回n值;错误,则返回NULL(0)。当正确地读取了n个数据后,文件内部指针会自动后移nsize个字节的位置。例7 从a盘根目录下名为“intb1.dat”的二进制数据文件中读取10个整数,输出到显示器上。程序清单如下:32#include stdio.h main()FILE*fp;int i,a10;if(fp=fopen(a:intb1.dat,rb)=NULL)printf(file can not open!n);e

23、xit(0);fread(a,sizeof(int),10,fp);for(i=0;i10;i+)printf(%d ,ai);fclose(fp);33文件处理的其它常用函数文件处理的其它常用函数1、文件头定位函数【函数头函数头】int rewind(FILE*fp)【参数参数】fp 文件型指针,通过fopen()函数获得的、已指向某 个打开的文件。【功能功能】将文件内部指针置于fp所指向的文件开头。【返回值返回值】正确,返回0;错误,返回非非0。例8 复制a盘当前目录下名为“char2.txt”的文本文件到b盘根目录下,文件名相同。然后再显示这两个文件中的内容。程序清单如下:34#incl

24、ude stdio.h main()FILE*fp1,*fp2;char c;char*fname1=a:char2.txt,*fname2=b:char2.txt;if(fp1=fopen(fname1,r)=NULL)printf(file can not open!n);eixt(0);if(fp2=fopen(fname2,w)=NULL)printf(file can not open!n);eixt(0);while(!feof(fp1)c=fgetc(fp1);fputc(c,fp2);rewind(fp1);35 while(!feof(fp1)putchar(fgetc(fp

25、1);fclose(fp2);if(fp2=fopen(fname2,r)=NULL)printf(file can not open!n);exit(0);while(!feof(fp2)putchar(fgetc(fp2);fclose(fp1);fclose(fp2);362、文件随机定位函数【函数头函数头】int fseek(FILE*fp,long offset,int from)【参数参数】fp 文件型指针,通过fopen()函数获得的、已指向 某个打开的文件。offset 长整型表达式,表示从from为起始位置的偏移字 节数。可以取正数(向文件尾方向移动)、0(不移动)、负数(向

26、文件头方向移动)。from 确定起始位置的参数。可以选取下列整型数或名称:整数 0 1 2 名称 SEEK_SET SEEK_CUR SEEK_END 起始位置 文件头文件头 内部指针的当前位置内部指针的当前位置 文件尾文件尾37【功能功能】将fp所指向的文件内部指针从from指定的起始位置移动offset个字节,指向新的位置。【返回值返回值】正确,返回0;错误,返回非非0。例如:fseek(fp,20L,1)表示从当前位置后移20个字节的 位置;fseek(fp,-10L,SEEK_END)表示从文件尾开始前移10 个字节的位置。注意,偏移量如果使用常数,则必须是长整型的,即整数后要加“L”

27、,或“l”。如果使用表达式,可以用“(long)()(表达表达式)式)”强制转换成长整型。38例9 设a盘根目录下有一个名为“intb1.dat”的二进制文件,其中连续存放了10个整数。要求读取并显示其中第1、3、5和第9、10个数据。程序清单如下:#include stdio.h main()FILE*fp;int i,x;if(fp=fopen(a:intb1.dat,rb)=NULL)printf(file can not open!n);exit(0);for(i=0;i3;i+)fseek(fp,(long)(i*sizeof(int),0);fread(&x,sizeof(int)

28、,1,fp);printf(%d.%dn,2*i+1,x);39 fseek(fp,-2L*sizeof(int),SEEK_END);fread(&x,sizeof(int),1,fp);printf(%d.%dn,9,x);fseek(fp,-1L*sizeof(int),SEEK_END);fread(&x,sizeof(int),1,fp);printf(%d.%dn,10,x);fclose(fp);403、错误测试函数【函数头函数头】int ferror(FILE*fp)【参数参数】fp 文件型指针,通过fopen()获得的、已指向某个打 开的文件。【功能功能】测试fp所指向的文件

29、在最近一次的操作(包括读写、定位等)时是否发生错误。有错,则返回非非0值;无 错,则返回0值。【返回值返回值】无错误,返回0;有错误,返回非非0。例10 重编上例的程序。要求使用错误测试函数来判断文件操作中是否发生错误。程序清单如下:41#include stdio.h void pro_err(fp)FILE*fp;if(ferror(fp)!=0)printf(file can not open!n);exit(0);else return;main()FILE*fp;int i,x;if(fp=fopen(a:intb1.dat,rb)=NULL)printf(file can not

30、open!n);exit(0);42for(i=0;i3;i+)fseek(fp,(long)(i*sizeof(int),0);pro_err(fp);fread(&x,sizeof(int),1,fp);pro_err(fp);printf(%d.%dn,2*i+1,x);fseek(fp,-2L*sizeof(int),SEEK_END);pro_err(fp);fread(&x,sizeof(int),1,fp);pro_err(fp);printf(%d.%dn,9,x);fseek(fp,-1L*sizeof(int),SEEK_END);pro_err(fp);fread(&x,

31、sizeof(int),1,fp);pro_err(fp);printf(%d.%dn,10,x);fclose(fp);43文件应用程序设计举例文件应用程序设计举例例11 设a盘根目录下面有一个名为“char2.txt”的文本文件。编一个程序,将该文件中的所有小写字母换成大写字母。程序清单如下:#include stdio.h#include ctype.hmain()FILE*fp;char c;if(fp=fopen(a:char2.txt,r+)=NULL)print(file can not open!n);exit(0);44while(!feof(fp)c=fgetc(fp);i

32、f(islower(c)!=0)c=toupper(c);fseek(fp,-1L,1);fputc(c,fp);fseek(fp,0L,1);fclose(fp);45例12 编一个函数,比较两个文本文件是否完全相同,若相同则返回值为1;若不相同则返回值为0。两个文本文件名作为函数的参数。函数清单如下:#include stdio.hint my_comp(fname1,fname2)char*fname1,*fname2;FILE*fp1,*fp2;int flag=1;char c1,c2;if(fp1=fopen(fname1,r)=NULL)printf(file can not o

33、pen!n);exit(0);46if(fp2=fopen(fname2,r)=NULL)printf(file can not open!n);exit(0);while(1)if(feof(fp1)&(feof(fp2)flag=1;break;if(feof(fp1)&(!feof(fp2)flag=0;break;if(!feof(fp1)&(feof(fp2)flag=0;break;c1=fgetc(fp1);c2=fgetc(fp2);if(c1!=c2)flag=0;break;fclose(fp1);fclose(fp2);return(flag);47课堂练习 1、若要用f

34、open函数打开一个新的二进制文件,该文件要既能读也能写,则文件方式字符串应是 。A)ab+B)wb+C)rb+D)ab答案:B 482、显示文本文件的内容并将行号显示出来。答案:#include#define LONGARRAY 256main()/*注:对文件操作的库函数,函数原型均在头文件stdio.h中 char buffLONGARRAY;/*buff is a char array*/int c,lcnt;FILE*fp;/*注意:结构类型名“FILE”必须大写*/char file20;puts(Input a file name:);scanf(%s,file);if(fp=f

35、open(file,r)=NULL)printf(nfile%s cant openedn,file);exit();lcnt=0;while(fgets(buff,LONGARRAY,fp)!=NULL)printf(%3d:%s,+lcnt,buff);fclose(fp);49 分析:(1)“文件名”是指要打开(或创建)的文件名。如果使用字符数组(或字符指针),则不使用双引号。(2)关于exit()函数 用法:void exit(程序状态值);功能:关闭已打开的所有文件,结束程序运行,返回操作系统,并将“程序状态值”返回给操作系统。当“程序状态值”为时,表示程序正常退出;非值时,表示程序出错退出。(3)“r(b)+”与“a(b)+”的区别:使用前者打开文件时,读写位置指针指向文件头;使用后者时,读写指针指向文件尾。50课程结束,再见!

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(《C语言程序设计》第十章文件课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|