收藏 分享(赏)

第10章-文件.ppt

上传人:无敌 文档编号:84382 上传时间:2018-03-11 格式:PPT 页数:31 大小:159.52KB
下载 相关 举报
第10章-文件.ppt_第1页
第1页 / 共31页
第10章-文件.ppt_第2页
第2页 / 共31页
第10章-文件.ppt_第3页
第3页 / 共31页
第10章-文件.ppt_第4页
第4页 / 共31页
第10章-文件.ppt_第5页
第5页 / 共31页
点击查看更多>>
资源描述

1、第十章 文件,本章目录,10.1文件概述,10.2文件的打开与关闭,10.3文件的读写,10.4文件的定位,10.5 错误处理,10.1文件概述,为了方便大量数据的输入输出和长期存储,有必要在C语言的程序设计中引入文件的知识。“文件”是指记录在外部介质上的数据的集合,是计算机中数据在存储介质上的存在形式。文件通常分为两大类:程序文件和数据文件。程序文件就是通常所说的可执行文件,是计算机指令和少量数据的集合。数据文件只包含待程序文件处理的数据,通常用来存储大量数据,例如:VCD文件、MP3文件、数据库文件。 C语言中的程序通过对文件的读、写等操作来实现对外部存储介质(例如磁盘)上数据的物理操作。

2、通过C语言提供的文件操作函数,可以简单、高效、安全地访问外部数据。 1.文件类型文件按其存储数据的格式分为两大类型:文本文件和二进制文件。两种文件格式主要有如下几点区别: 1)文本文件由可显示字符组成,如字母、数字、符号;而二进制文件只是若干长度的0、1序列。 2)文本文件以字符(8位)为单位写入和读取;二进制文件则以数据块为 单位进行读写。 3)文本文件用于存储文字信息,说明文件、C语言源程序文件都是文本文件;二进制文件用于存储非文本数据,如二进制执行代码、图像、声音等。,10.1文件概述,4)文本文件可以直接在屏幕上显示文件内容;二进制文件虽然可以显示,但显示的内容无意义 2.文件类型指针

3、在C语言中引入了文件指针的概念,所有对文件的操作都通过文件指针完成。 文件指针类似于C语言中的普通指针,但文件指针不是指向一段内存空间,而是指向一个文件信息结构体,该结构体描述一个文件的相关信息,其定义在stdio.h头文件中。用户无需了解有关此结构体的细节,只需要知道如何使用文件指针即可。声明一个文件指针使用以下语句: FILE * 文件指针名 1)要使用文件指针进行文件相关操作必须在程序中包含stdio.h头文件。 2)“FILE”全是大写字符,若改成小写字母是错误的。 3)声明一个文件指针后,就可以使用各种函数打开、关闭文件以及进行读写操作。 C语言中,对文件的基本操作可以说就是文件的打

4、开和关闭、文件的读写等操作。,10.2文件的打开与关闭,在实际应用当中,经常要对文件进行处理,C程序对文件的处理过程一般如下: 文件的打开。建立一个新的文件或为存取某一个文件的数据而打开文件 对文件进行读、写或其他操作 关闭文件。文件使用完后,要关闭文件,保存文件的改写。 1.文件的打开(fopen函数) 在C语言中文件的打开库函数来实现,其格式如下: FILE * fp; /*声明一个文件指针*/ fp = fopen(文件名,打开方式); 文件名:是要求打开文件的文件名(包括扩展名),是一个字符串,以双引号括起。如果省略文件路径,则在当前目录下打开文件。 打开放式:有只读、只写、追加、读写

5、几种,使用不同的标识符区分。标识符见表9.1,10.2文件的打开与关闭,表9.1,10.2文件的打开与关闭,例如: fp = fopen(“abc.txt”,”r”) /* 以只读方式打开abc.txt文件*/ fp = fopen(“abc.c”,”r+”) /*以读写方式打开abc.c文件*/ fopen() 函数的返回值是一个文件信息结构体的地址,该文件信息结构体是描述目标文件的相关信息。调用fopen()函数前必须声明一个文件指针,并使用文件指针接受fopen()函数的返回值。文件指针被赋值后,程序中就通过这个文件指针对目标文件进行操作。若不使用文件指针接受fopen()函数的返回值,

6、则无法对已打开的文件进行访问,调用fopen()函数也是无意义的。 如果不能实现“打开”的任务,fopen函数将会带回一个出错信息。出错的原因可能是用“r”方式打开一个并不存在的文件;磁盘出故障;磁盘已满无法建立新文件等。此时fopen函数将带回一个空指针值NULL(NULL在stdio.h文件中已被定义为0)。常用下面的方法打开一个文件: if(fp=fopen(“file”,”r”)=NULL) printf(“cannot open this filen”); exit(0); ,10.2文件的打开与关闭,即先检查打开的操作有否出错,如果有错就在终端上输出“cannot open thi

7、s file”。Exit函数的作用是关闭所有文件,终止正在调用的过程。待用户检查出错,修改后在运行。 2.文件的关闭(fclose函数) 使用完一个文件之后应该尽快关闭,以免数据丢失。关闭一个文件使用fclose()函数实现,其格式如下: Fclose(文件指针) 文件指针:指明要关闭哪个文件,作为参数的文件指针必须是由打开文件函数fopen()得到的。例如: #include main() FILE *fp; if(fp=fopen(“abc.txt,”“r”)=0) /*尝试打开文件*/,10.2文件的打开与关闭, 文件打开错误处理 else /*打开文件成功*/ 读写文件操作 fclos

8、e(fp); 以上程序由打开文件函数fopen()和关闭文件函数fclose()共同构成了包含文件操作的C语言程序框架。abc.txt是文件名。应该养成在程序终止之前关闭所有文件的习惯,如果不关闭文件将会丢失数据,因为,在向文件写数据时,是先将数据输到缓冲区,待缓冲区充满后才正式输出给文件。如果当数据未充满缓冲区而程序结束运行,就会将缓冲区中的数据丢失。用fclose函数关闭文件,可以避免这个问题,它先把缓冲区中的数据输出到磁盘文件,然后才在释放文件指针变量。,10.3文件的读写,对文件来说,读写操作是非常重要的,常用的读写函数如下:10.3.1 fgetc()函数和fputc()函数 对文件

9、的操作时一次读写一个字符。 1fgetc()函数从指定的文件读取一个字符,该文件必须是以读或读写方式打开的。其格式如下: char c; c = fgetc(文件指针)文件指针:指向一个已打开的文件,ch为字符变量。fgetc函数的返回值是一个字符,赋给ch。如果在执行fgetc函数读字符时遇到文件结束符,函数返回一个文件结束标志EOF(-1)。如果想从一个磁盘文件顺序读入字符并在屏幕上显示出来,可以如下操作: ch=fgetc(文件指针); while(ch! = EOF) putchar(ch); ch=fgetc(文件指针); ,10.3文件的读写,注意:EOF不是可输出字符,因此不能在

10、屏幕上显示。由于字符的ASCII码不可能出现-1,因此EOF定义为-1是合适的。当读入的字符值等于-1(即EOF)时 ,表示读入的已不是正常的字符而是文件结束符。但以上只使用于读文本文件的情况。现在 ANSI C已允许用缓冲文件系统处理二进制文件,而读入某一个字节中的二进制数据的值有可能是-1,而这又恰好是EOF的值。这就出现了需要读入有用数据而却被处理为“文件结束”的情况。为了解决这个问题,ANSI C提供一个feof函数来判断文件是否真的结束。feof(fp)用来测试fp所指向的文件当前状态是否“文件结束”。如果是文件结束,函数feof(fp)的值为1(真),否则为0(假)。如果读入一个二

11、进制文件中的数据,可以用 while(! feof(fp) c=fgetc(fp); 2fputc()函数把一个字符写到磁盘文件上去,其格式如下: fputc(字符,文件指针); 例如向文件指针fp所指的文件写入字符c的语句是: fputc(c,fp);,10.3文件的读写,如果函数调用成功,则返回写入的字符;如果失败,则返回EOF(-1)。下面的程序实现了复制文件的功能,源文件为c:tcabc.txt,目标文件为c:tcxyz.txt。例10.1 程序举例 #include main() FILE *fp1,*fp2; /* 声明两个文件指针,分别用于源文件和目标文件*/ char c; i

12、f(fp1=fopen(abc.txt,r)=NULL | (fp2=fopen(xyz.txt, w+)=NULL) /* 同时打开源文件和目标文件,分别为只读方式和新建文件方式*/ printf(File Open Errorn); else while (c=fgetc(fp1)!=EOF) /* 循环从源文件读入字符,遇到文件结束符停止*/,10.3文件的读写,fputc(c,fp2); fclose(fp1); fclose(fp2); system(cls); printf(abc.txt:n); system(type abc.txt); /* 调用DOS命令输出源文件内容*/

13、printf(nnxyz.txt:n); system(type xyz.txt); /* 调用DOS命令输出目标文件内容*/ 运行结果如下:,10.3文件的读写,10.3.2 fgets()函数和fputs()函数 以字符为单位的fgetc()函数和fputc()函数一次只能读出或写入一个字符到文件中,显然处理大量数据时效率不高,以字符串为单位的fgets()函数和fputs()函数可以一次从文件输入或向文件输出一个字符串。 1fgets ()函数fgets()是从文件而不是从标准输入设备取得字符串。其格式如下: fgets(字符串指针,字符个数,文件指针); 其中第一个参数“字符串指针”,

14、即一个字符组名或指向字符的指针,用于存放读出的字符串;第二个参数指明读出多少个字符,是一个整型数;第三个参数即目标文件的文件指针。 fgets()在遇到换行符或文件结束符时,即使已读取得字符数小于参数中指定的数量也会自动停止。如程序设计者已经知道abc.txt文件不大于100个字节,调用fgets()函数的第二个参数为100,使得整个文件被一次读取。若abc.txt文件大于100字节,则后面的内容没有被读取。如果fgets()读取到文件结束符,将会返回一个NULL值。可以据此判断是否到达文件尾部,使用循环语句读出整个文件。若目标文件的结构不清晰,一般使用fgetc()函数逐个字符读取,逐个处理

15、。在预先知道目标文件结构的情况下,使用fgets()函数能提高效率。,10.3文件的读写,2fputs()函数fputs()函数用于向文件写入字符串,它的使用格式如下: fputs(字符串,文件指针);第一个参数可以是一个字符串,也可以是一个字符数组或指向字符的指针;第二个参数是文件指针。例如: char c100; char *s; fputs(“Hello”,fp); /*将字符串“Hello”写到fp所指文件中 */ fputs(*s,fp); /*将字符指针s所指的字符串写到fp所 指文件中*/ fputs(c,fp); /*将字符数组c的内容写到fp所指文件中*/下面的程序利用fge

16、ts()函数和fputs()函数实现了复制文件的功能,源文件为abc.txt,目标文件为xyz.txt。,10.3文件的读写,例10.2 程序举例 #include main() FILE *fp1,*fp2; char s100; if(fp1=fopen(abc.txt,r)=NULL | (fp2=fopen(xyz.txt, w+)=NULL) printf(File Open Errorn); else fgets(s,100,fp1); fputs(s,fp2); fclose(fp1); fclose(fp2); ,10.3文件的读写,system(cls); printf(ab

17、c.txt:n); system(type abc.txt); printf(nnxyz.txt:n); system(type xyz.txt); 运行结果:,10.3文件的读写,10.3.3 fwrite()函数和fread()函数 这类操作,以二进制方式读写文件。 在某些情况下不合适使用文本方式读写文件,在这种情况下,选择使用二进制方式读写文件。如果采用二进制读写方式,那么数据在文件中的占用空间的大小与在内存中完全一致。二进制读写方式克服了文本读写方式的缺点,能够获得更高的时间、空间效率和安全性。在内存中连续的若干长度的,表示特定一个或多个数据的二进制数据称为二进制数据块。 1fwrit

18、e()函数 使用fwrite()函数可以将内存中的二进制数据以数据块为单位写入指定的二进制文件中,其格式如下: fwrite(内存起始地址,数据块长度,重复次数,目标文件指针);例: FILE *fp;,10.3文件的读写,int a=12345; /*以二进制方式打开文件*/ fwrite( /*使用sizeof()函数取得输出变 量a的长度*/ 如果fwrite调用成功,则函数返回值为count的值,即输入或输出数据项的完整个数。 使用fwrite()函数也可以整个数组或结构体以二进制方式写入文件中。,10.3文件的读写,例: FILE *fp; float x10; /*以二进制形式打开

19、文件*/ fwrite(x,sizeof(float)*10,1,fp); /*将浮点型数值x的所有元 素都写入fp所指的二进制文件中*/ 2fread ()函数 与写二进制数据块函数fwrite()对应,fread()用于读取已经写入到二进制文件的二进制数据块。fread()函数使用格式: fread(内存起始地址,数据块长度,重复次数,目标文件指针);fread()函数中三个参数的意义与fwrite()函数中对参数的意义相似,只是两者传输数据的方向不同。 fread()函数返回一个整型数值。如果所有数据都成功读取, fread()函数返回第三个参数的值;如果读取数据出错或遇到文件结束符,f

20、read()函数返回成功读取的数据块的数量,即成功读取了多少个指定长度(由第二个参数决定)的数据块。,10.3文件的读写,例: FILE *fp; int a; /*打开文件*/ fread( /*错误!*/这条语句从文件指针fp所指的二进制文件中读取11个字符的数据,已经超出了name数组的范围。,10.3文件的读写,例10.3 现有一个关于学生信息的磁盘文件file1,请把该文件存入另一个文件file2中。实际上,这个题目的要求是编写一个程序,实现文件复制功能。其程序如下: #include struct stu /*宏定义*/ int id; /*结构体成员*/ char name20;

21、 int age; ; main() /*主函数*/ struct stu stu1; /*定义结构体变量*/ int n FILE *in,*out;,10.3文件的读写,if(in=fopen(file1.txt,r)=NULL | (out=fopen(file2.txt, w+)=NULL) printf(File Open Errorn); /*打开文件*/ else while(fread( /*关闭文件*/ 该函数每次以二进制形式从file1文件中读取一个结构类型(stu)的数据,然后把该数据写到file2文件中。当fread()函数的返回值不等于1时,就意味着读出错或读结束,此

22、时结束循环。关于代码的详细情况,请参见代码中的注释,10.3文件的读写,10.3.4 fscanf()函数和fprintf()函数下面介绍具有更强大的功能的文件格式化输入、输出函数:fscanf函数和fprintf()函数。1)fscanf()函数fscanf()函数的功能与使用方法与scanf()函数基本相同,只是fscanf()函数获取数据的来源文件,而不是键盘。fscanf()函数使用格式: fscanf(文件指针,输入内容,输入项); fscanf()函数的第一个参数是一个文件指针,指出从哪个文件输入格式化数据。除此外,fscanf()函数与scanf()函数在使用上没有差别。例: F

23、ILE *fp; int d; char c;,10.3文件的读写, /*打开文件*/ fscanf(fp,“%d %c”, /*输出数据到文件*/,10.3文件的读写,上面的语句使用fprintf()函数向文件指针fp所指的文件输出一个整型数据和一个回车符。使用fscanf()函数和fprintf()函数时,由于在输入时要将ASCII码转换为二进制形式,在输出时又要将二进制形式转换成字符,花时间较多。用fscanf()函数和fprintf()函数对磁盘文件读写,使用方便,但在内存与磁盘频繁交换数据的情况下,最好不用fprintf和fscanf函数,而用fread和fwrite函数。,10.4

24、文件的定位,在对文件进行操作时,不一定始终都是从文件的开始位置进行操作的,因此,对文件的定位非常重要。本节将介绍一系列文件定位函数。1.fseek()函数fseek()函数可以实现改变文件的位置指针。fseek()函数的格式如下: fseek(文件指针,偏移量,基点); 文件指针无需详细说明;偏移量表示以基点为起始位置,向前或向后移动的距离,以字节为单位,数据类型为长整形;基点有三个取值,意义:0文件开头,1文件当前位置,2文件末尾。例如: FILE *FP; /*打开文件*/ fseek(fp,5L,0); /*将位置指针移到距文件开头5个字节处*/ fseek(fp,-10L,0); /*

25、使位置指针相对文件当前位置向前移动10 个字节处*/ fseek(fp,-40L,0); /*使位置指针移到距文件尾部40个字节处*/ 第二个参数是长整型数据,因而要在数值后加“L”表示这是一个长整型数。如果成功移动,fseek()将返回0值,否则返回非0值。,10.4文件的定位,2.rewind()函数调用函数能使位置指针重新返回文件的开头。此函数没有返回值。rewind()函数的格式如下: rewind(文件指针);例如: FILE *fp; /*打开文件*/ fseek(fp,5l,0); /*使位置指针移到距文件开头5个字节处*/ rewind(); /*使位置指针回到文件开头*/3.

26、ftell()函数ftell()函数的功能很简单,它返回当前位置指针的位置。例如: FILE *fp; /*打开文件*/ fseek(fp,5l,0); /*使位置指针移到距文件开头5个字节处*/ printf(“%ld”,ftell(fp); /*输出5*/ rewind(); /*使位置指针回到文件开头*/ printf(“%ld”,ftell(fp); /*输出0*/ 如果出错,ftell()函数将返回-1值。,10.5 错误处理,在文件操作过程中难免会遇到错误,因此,对文件错误的处理非常必要。C标准提供一些函数用来检查输入输出函数调用中的错误。1.ferror函数在调用各种输入输出函数

27、时。如果出错,除了函数返回值有所反映外,还可以用ferror函数检查。ferror函数的格式如下: ferror(文件指针);如果ferror返回值为0,表示未出错。如果返回一个非零值,表示出错。在执行fopen函数时,ferror函数的初始值自动置为0。应注意,对同一个文件每一次调用输入输出函数,均产生一个新的ferror函数值,因此,应当在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。2.clearerr函数 它的作用是使文件错误标志和文件结束标志为0。假设在调用一个输入输出函数时出现错误,ferror函数值为一个非零值。在调用clearerr(fp)后,ferror

28、(fp)的值变成0。 只要出现错误标志,就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数。,本章小结,(1) 文件按其存储数据的格式分为两大类型:文本文件和二进制文件。(2)在C语言中,使用一种特殊的文件指针代表某个文件。所有对文件的操作都必须通过文件指针完成。文件指针是指向一个文件结构体的指针。文件结构体的定义存在于stdio.h头文件中,因为设计文件操作的C语言程序必须包含这个头文件(3)对一个文件进行读写操作前首先必须打开这个文件,操作完成后应关闭已打开的文件。(4)C语言提供多种打开文件的方式,有只读、只写、读写、追加、新建等,分别用不同的标识符表示。,Thank You !,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报