《C语言程序设计》课件第08章_第1页
《C语言程序设计》课件第08章_第2页
《C语言程序设计》课件第08章_第3页
《C语言程序设计》课件第08章_第4页
《C语言程序设计》课件第08章_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章文件语言程序设计第八章文件C8.1问题的提出

8.2文件的概念8.3文件操作的常用函数8.4本章小结8.5问与答内容简介8.1问题的提出语言程序设计第八章文件C在调试大程序中要进行大量数据的输入输出和处理时,需花费不少时间用在输入数据或查看结果上,这导致调试效率降低。能不能把这此数据放到某个地方,在需要时直接使用呢?本章将讲述在C语言中使用文件来存储这些数据的方法与步骤。8.2文件的概念语言程序设计第八章文件C文件是指存储在外部介质上一组相关数据的集合。例如,程序文件是程序代码的集合;数据文件是数据的集合。操作系统以文件为单位对数据进行管理,每个文件有一个名称,即文件名。文件名是文件的标识,操作系统通过文件名访问文件。例如,通过文件名查找、打开文件,然后读取或写入数据。1、磁盘文件、设备文件(1)磁盘文件:文件一般保存在磁介质(如软盘、硬盘)上,所以称为磁盘文件。(2)设备文件:操作系统还经常将与主机相连接的I/O设备(如键盘、输入文件、显示器、打印机、输出文件)也看作文件,即设备文件。很多磁盘文件的概念、操作对设备文件也同样有意义,有效。8.2文件的概念语言程序设计第八章文件C2、ASCII文件、二进制文件根据文件的组织形式,文件可以分为ASCII文件和二进制文件。(1)ASCII文件(文本文件):每个字节存放一个ASCII码,代表一个字符。ASCII文件可以阅读,可以打印,但是它与内存数据交换时需要转换。(2)二进制文件:将内存中的数据按照其在内存中的存储形式原样输出并保存在文件中。二进制文件占用空间少,内存数据和磁盘数据交换时无须转换,但是二进制文件不可阅读、打印。文本文件/二进制文件不是用后缀来确定的,而是以内容来确定的,但是文件后缀往往隐含其类别,如*.txt代表文本文件,*.bmp、*.exe代表二进制文件。8.2文件的概念语言程序设计第八章文件C3、缓冲文件系统、非缓冲文件系统(1)缓冲文件系统:系统自动地在内存中为每个正在使用的文件开辟一个缓冲区。在从磁盘读数据时,一次从磁盘文件将一些数据输入到内存缓冲区(充满缓冲区),然后从缓冲区逐个将数据送给接受变量;向磁盘文件输出数据时,先将数据送到内存缓冲区,装满缓冲区后才一起输出到磁盘,减少对磁盘的实际访问(读/写)次数。ANSIC只采用缓冲文件系统。(2)非缓冲文件系统:不由系统自动设置缓冲区,而由用户根据需要设置。C语言中,没有输入输出语句,对文件的读写者是用库函数实现的。8.3文件操作的常用函数语言程序设计第八章文件C在C语言程序中,无论是一般磁盘文件还是设备文件,都可以通过文件结构类型的数据集合进行输入输出操作。文件结构是由系统定义的,取名为FILE。FILE类型是一种结构体类型,在stdio.h中定义其用于存放文件的当前的有关信息。程序使用一个文件,系统就为此文件开辟一个FILE类型变量。程序使用几个文件,系统就开辟几个FILE类型变量,存放各个文件的相关信息。

8.3文件操作的常用函数语言程序设计第八章文件C在stdio.h文件中有以下的文件类型声明:typedef

struct{shortlevel;/*fill/emptylevelofbuffer*/unsignedflags;/*文件状态标志*/charfd;/*文件描述符*/unsignedcharhold;/*Ungetccharifnobuffer*/shortbsize;/*缓冲区大小*/unsignedchar*buffer;/*数据传输缓冲区*/unsignedchar*curp;/*当前激活指针*/unsignedistemp;/*临时文件指示器*/shorttoken;/*用于合法性校验*/}FILE;8.3文件操作的常用函数语言程序设计第八章文件C对FILE结构体的访问通常是通过FILE类型指针变量(简称文件指针)完成的,文件指针变量指向文件类型变量,简单地说就是文件指针指向文件。事实上,只需要使用文件指针完成文件的操作,根本不必关心文件类型变量的内容。在打开一个文件后,系统开辟一个文件变量并返回此文件的文件指针,将此文件指针保存在一个文件指针变量中,以后所有对文件的操作都通过此文件指针变量完成,直到关闭文件,才释放文件指针指向的文件类型变量。例如:定义一个指向文件的指针变量fp。fp=fopen(“data.txt”,…);打开文件时,系统开辟一个文件变量,并返回文件指针,将此指针赋值(保存)给文件指针变量fp。fclose(fp);关闭文件,释放文件指针fp指向的文件变量。8.3文件操作的常用函数语言程序设计第八章文件C对文件的操作的步骤:先打开,后读写,最后关闭。(1)文件的打开(fopen函数)文件打开后才能进行操作,文件打开通过调用fopen函数实现。调用fopen的格式是:FILE*fp;fp=fopen(文件名,打开方式或使用方式);注意:一定将函数返回的文件指针赋值给“文件指针变量”。例如:FILE*fp;fp=fopen(“d:\\data.txt”,”r”);8.3.1文件的打开与关闭8.3文件操作的常用函数语言程序设计第八章文件C说明:①上面的语句表示打开d盘根目录下文件名为data.txt的文件,打开方式”r”表示只读。fopen函数返回指向d:\\data.txt的文件指针,然后赋值给fp,fp指向此文件,即fp与此文件关联。②关于文件名要注意:文件包含文件名.扩展名;路径要用“\\”表示。③打开方式如下表所示,不同类的打开方式可以组合。8.3.1文件的打开与关闭8.3文件操作的常用函数语言程序设计第八章文件C文件使用方式含义“r”(只读)为输入打开一个文本文件“w”(只写)为输出打开一个文本文件“a”(追加)向文本文件尾添加数据“rb”(只读)为输入打开一个二进制文件“wb”(只写)为输出打开一个二进制文件“ab”(追加)向二进制文件尾添加数据“r+”(读写)为读写打开一个文本文件“w+”(读写)为读写建立一个新的文本文件“a+”(读写)为读写打开一个文本文件“rb+”(读写)为读写打开一个二进制文件“wb+”(读写)为读写建立一个新的二进制文件“ab+”(读写)为读写打开一个二进制文件8.3.1文件的打开与关闭8.3文件操作的常用函数语言程序设计第八章文件C(2)文件打开方式(使用方式)的说明①文件打开一定要检查fopen函数的返回值,因为有可能文件不能正常打开。不能正常打开时fopen函数返回NULL。可以用下面的形式检查:if((fp=fopen(…))==NULL){printf(“openfileerror\n”);exit(1);}②”r”方式:只能从文件读入数据而不能向文件写入数据。该方式要求欲打开的文件已经存在。③”w”方式:只能向文件写入数据而不能从文件读入数据。如果文件不存在,则创建文件;如果文件存在,则原文件被删除,然后重新创建文件(相当于覆盖原文件)。④”a”方式:在文件末尾添加数据,而不删除原文件。该方式要求欲打开的文件已经存在。8.3.1文件的打开与关闭8.3文件操作的常用函数语言程序设计第八章文件C(2)文件打开方式(使用方式)的说明⑤”+”(“r+”、”w+”、”a+”):均为可读、可写。但是”r+”、”a+”要求文件已经存在,”w+”无此要求;”r+”打开文件时文件指针指向文件开头,”a+”打开文件时文件指针指向文件末尾。⑥”b”:以二进制方式打开文件。⑦读文本文件时,将“回车/换行”转换为“换行”;写文本文件时,将“换行”转换为“回车/换行”。⑧程序开始运行时,系统自动打开三个标准文件:标准输入、标准输出、标准出错输出。一般这三个文件对应于终端(键盘、显示器)。这三个文件不需要手工打开就可以使用。标准输入、标准输出、标准出错输出对应的文件指针是stdin、stdout、stderr。8.3.1文件的打开与关闭8.3文件操作的常用函数语言程序设计第八章文件C(3)文件的关闭(fclose函数)文件使用完毕后必须关闭,以避免数据丢失。格式:fclose(文件指针);例如:fclose(fp);fclose()函数也会带回一个返回值,如果顺利执行了关闭操作,则返回为0;否则会返回EOF(-1)。8.3.1文件的打开与关闭8.3文件操作的常用函数语言程序设计第八章文件C对于文本文件,可以通过判断读入的字符是不是EOF来决定是否到了文件尾。对于二进制文件,再使用EOF就不行了。因为,EOF在二进制文件中也是一个合法的数据。这时,可以使用函数feof()判断。进行文件访问时,出现错误是难免的。应用时经常需要对文件的关键操作进行判断和检测,以便进行后续处理。C语言函数库中的ferror()提供了返回流操作中检测错误的功能。(1)feof(FILE*fp)该函数的功能是在进行文件读操作时,如果遇到文件尾,此函数返回逻辑真(非0);否则返回逻辑假(0)。此函数适用于文本文件和二进制文件。8.3.2文件的错误检测与处理8.3文件操作的常用函数语言程序设计第八章文件C(2)ferror(FILE*fp)该函数的功能是检测函数调用是否有错误。当调用输入输出函数后,可再调用此函数。若函数返回值为0,表明前面的输入输出操作没有错误;若返回值为非0值,则表明有错误,应及时检查。(3)clearerr(FILE*fp)该函数的功能是使文件错误标志和文件结束标志置为0。若文件检测有错误(即函数返回值为非0值),可调用本函数,使ferror(fp)的值变为0。8.3.2文件的错误检测与处理8.3文件操作的常用函数语言程序设计第八章文件C文件打开后才可以对文件进行操作。也就是说,文件必须经历打开——操作——关闭的过程。C语言对文件的操作都是通过调用标准I/O库函数实现的。文件操作实际是指对文件的读写。文件的读操作就是从文件中读出数据,即将文件中的数据输入到计算机;文件的写操作是向文件中写入数据,即向文件输出数据。实际上对文件的处理过程就是对文件的输入输出过程。本节讨论对磁盘文件的输入输出函数,这类文件及其相应函数在实际应用和文件处理中占据重要的地位。

8.3.3文件的顺序读写及其范例8.3文件操作的常用函数语言程序设计第八章文件CC语言提供的缓冲式文件处理函数可分为:字符输入输出函数:fgetc和fputc字符串输入输出函数:fgets和fputs格式化输入输出函数:fscanf和fprintf数据块输入输出函数:fread和fwrite8.3.3文件的顺序读写及其范例8.3文件操作的常用函数语言程序设计第八章文件C(1)字符输入/输出函数①字符输入函数fgetc()fgetc函数的调用形式为:ch=fgetc(fp);其中fp为文件型指针变量,ch为字符变量。函数功能:从指定的文件中读取一个字符。即从fp所指向的文件(该文件必须是以读或读写方式打开的)中读取一个字符并返回,读取的字符赋给变量ch。若读取字符时文件已经结束或出错,fgetc函数返回文件结束标记EOF,此时EOF的值为-1。例如,要从磁盘文件中顺序读入字符并在屏幕上显示,可通过调用fgetc函数实现:while((c=fgetc(fp))!=EOF)putchar(c);8.3.3文件的顺序读写及其范例8.3文件操作的常用函数语言程序设计第八章文件C【例8-1】在屏幕上显示文本文件内容。#include"stdio.h"main(){FILE*fp;charfilename[20],ch;

printf("Enterfilename:");

scanf("%s",filename);/*输入文件名,包括路径和扩展名*/

if((fp=fopen(filename,"r"))==NULL)/*打开文件*/{printf("fileopenerror.\n");/*出错处理*/exit(0);}

while((ch=fgetc(fp))!=EOF)/*从文件中读字符*/

putchar(ch);/*显示从文件读入的字符*/

fclose(fp);/*关闭文件*/}EX8_1.c演示8.3.3文件的顺序读写及其范例8.3文件操作的常用函数语言程序设计第八章文件C②字符输出函数fputc()fputc函数的调用形式为:fputc(ch,fp);其中,ch是要输出的字符(可为字符常量或字符变量),fp为文件型指针变量。函数功能:将一个字符输出到指定文件中。即将字符变量ch中的字符输出到fp所指向的文件。若输出操作成功,该函数返回输出的字符;否则,返回EOF。8.3.3文件的顺序读写及其范例8.3文件操作的常用函数语言程序设计第八章文件C【例8-2】从键盘输入一字符串,并逐个将字符串的每个字符传送到磁盘文件file中,当输入的字符为“#”时停止输入。#include"stdio.h"main(){FILE*fp;/*指向磁盘文件file的指针*/charch;/*暂存读入字符的字符变量*/charfilename[20];/*存放磁盘文件名的字符数组*/

printf("Enterfilename:");

scanf("%s",filename);/*从键盘输入磁盘文件名,包括路径*/8.3.3文件的顺序读写及其范例8.3文件操作的常用函数语言程序设计第八章文件C

if((fp=fopen(filename,"w"))==NULL)/*以只写方式打开文本文件,并判断是否能正常打开*/{printf(“Cannotopenfile.\n”);/*不能正常打开磁盘文件的处理*/exit(0);/*调用函数exit终止程序运行*/}printf("Enterastring:");

ch=getchar();/*从键盘上输入一个字符*/

while(ch!='#')/*判断输入字符是否为#*/{fputc(ch,fp);/*将字符写入到磁盘文件*/

ch=getchar();/*从键盘上输入下一个字符*/}

fclose(fp);/*操作结束后关闭磁盘文件*/}EX8_2.c演示8.3.3文件的顺序读写及其范例8.3文件操作的常用函数语言程序设计第八章文件C

(2)字符串输入输出函数①字符串输入函数fgets()函数的调用形式:fgets(str,n,fp);函数功能:从fp所指文件中读入n-1个字符放入以str为起始地址的空间内。如果在未读完n-1个字符时,已经读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,确切地说,调用fgets()函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加’\0’,并以str作为函数值返回。②字符串输出函数fputs()函数的调用形式:fputs(str,fp);函数功能:将str指向的字符串写入fp文件指针所指的文件。操作成功时,函数返回0值,失败则返回非零值。8.3.3文件的顺序读写及其范例8.3文件操作的常用函数语言程序设计第八章文件C

【例8-3】从一个文本文件t1.txt中读出字符串,再写入另一个文件t2.txt。#include"stdio.h"#include"string.h"main(){FILE*fp1,*fp2;charstr[128];if((fp1=fopen("D:\clessons\example\t1.txt","r"))==NULL)/*以只读方式打开t1.txt*/{

printf("Cannotopenfile.\n");exit(0);}8.3.3文件的顺序读写及其范例EX8_3.c演示8.3文件操作的常用函数语言程序设计第八章文件C

if((fp2=fopen("D:\clessons\example\t2.txt","w"))==NULL)/*以只写方式打开t1.txt*/{printf("Cannotopenfile.\n");exit(0);}while((strlen(fgets(str,128,fp1)))>0)/*从文件中读到的字符串长度大于0*/{fputs(str,fp2);/*从t1.txt读字符串并写入t2.txt*/

printf("%s",str);/*在屏幕上显示读到的字符串*/}fclose(fp1);fclose(fp2);}8.3.3文件的顺序读写及其范例8.3文件操作的常用函数语言程序设计第八章文件C(3)格式化的读写前面的章节中,介绍了利用scanf()和printf()函数从键盘格式化输入及在显示器上进行格式化输出。对文件的格式化读写就是在上述函数的前面加一个字母f成为fscanf()和fprintf()。其函数调用方式为:fscanf(文件指针,格式控制串,输入表项);fprintf(文件指针,格式控制串,输出表项);其中,当文件指针为stdin、stdout时,以上两函数等同于scanf()函数和printf()函数。函数功能:按格式对文件进行I/O操作,成功时返回I/O的个数;出错或文件尾时,返回EOF。例如:fscanf(fp,”%d%s”,&i,s);fprintf(fp,”%d%c”,j,ch);8.3.3文件的顺序读写及其范例8.3文件操作的常用函数语言程序设计第八章文件C【例8-4】将一些格式化的数据写入文本文件,再从该文件中以格式化方法读出显示到屏幕上,其格式化数据是两个学生记录,包括姓名、学号、两科成绩。#include"stdio.h"main(){FILE*fp;

inti;

struct

stu/*定义结构体类型*/{charname[10];charnum[6];floatscore[2];}student;/*定义结构体变量*/8.3.3文件的顺序读写及其范例EX8_4.c演示8.3文件操作的常用函数语言程序设计第八章文件Cif((fp=fopen(“D:\\t1.txt","w"))==NULL)/*以只写方式打开文本文件*/{printf("Cannotopenfile.");exit(0);}

printf("Inputdata:\n");

for(i=0;i<2;i++){scanf("%s%s%f%f",,student.num,&student.score[0],&student.score[1]);/*从键盘输入数据*/

fprintf(fp,"%s%s%7.2f%7.2f\n",,student.num,student.score[0],student.score[1]);/*写入文件*/}

fclose(fp);/*关闭文件*8.3.3文件的顺序读写及其范例8.3文件操作的常用函数语言程序设计第八章文件C

if((fp=fopen(“D:\\t1.txt","r"))==NULL)/*以只读方式重新打开文本文件*/{printf("Cannotopenfile.");exit(0);}

printf("Outputfromfile:\n");

while(fscanf(fp,"%s%s%f%f\n",,student.num,&student.score[0],&student.score[1])!=EOF)/*从文件读入*/{printf("%s%s%7.2f%7.2f\n",,student.num,student.score[0],student.score[1]);/*显示到屏幕*/}

fclose(fp);/*关闭文件*/}8.3.3文件的顺序读写及其范例8.3文件操作的常用函数语言程序设计第八章文件C(4)数据块读写前面介绍的几种读写文件的方法,对其复杂的数据类型无法以整体形式向文件写入或从文件读出。C语言提供成块的读写方式来操作文件,使其数组或结构体等类型可以进行一次性读写。成块读写文件函数的调用形式为:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);其中,buffer是数据块的指针,对fread()来说,它是一个内存块的首地址,输入的数据存入这个内存块中;对于fwrite()来说,它是准备输出的数据块的起始地址。size表示每个数据块的字节数,count用来指定每读、写一次,输入或输出数据块的个数(每个数据块具有size字节)。fp为文件指针。关于成块的文件读写,在创建文件时只能以二进制文件格式创建。8.3.3文件的顺序读写及其范例8.3文件操作的常用函数语言程序设计第八章文件C【例8-5】向磁盘写入格式化数据,再从该文件读出显示到屏幕。#include"stdio.h"#include"stdlib.h"main(){FILE*fp1;

inti;

struct

stu/*定义结构体*/{charname[10];charnum[9];floatscore[2];}student;。8.3.3文件的顺序读写及其范例EX8_5.c演示8.3文件操作的常用函数语言程序设计第八章文件C

if((fp1=fopen(“d:\\t1.txt","wb"))==NULL)/*以只写方式打开二进制文件*/{printf("Cannotopenfile.\n");exit(0);}

printf("inputdata:\n");

for(i=0;i<2;i++){scanf("%s%s%f%f",,student.num,&student.score[0],&student.score[1]);/*输入一条记录*/fwrite(&student,sizeof(student),1,fp1);/*成块写入文件*/}fclose(fp1);8.3.3文件的顺序读写及其范例8.3文件操作的常用函数语言程序设计第八章文件C

if((fp1=fopen(“d:\\t1.txt","rb"))==NULL)/*重新以二进制只写打开文件*/{printf("Cannotopenfile.\n");exit(0);}

printf("Outputfromfile:\n");

for(i=0;i<2;i++){fread(&student,sizeof(student),1,fp1);/*从文件成块读*/

printf("%s%s%7.2f%7.2f\n",,student.num,student.score[0],student.score[1]);/*显示到屏幕*/}fclose(fp1);}8.3.3文件的顺序读写及其范例8.3文件操作的常用函数语言程序设计第八章文件C

8.3.4文件的随机读写及其范例前面介绍的对文件的操作都是顺序读写,即从文件的第一个数据开始,依次进行读写。由指向文件的指针自动移位。但在实际对文件的应用中,还往往需要对文件中某个特定的数据进行处理,这就要求对文件具有随机读写的功能,也就是强制将文件的指针指向用户所希望的指定位置。C语言对文件的定位提供了三个函数fseek()、rewind()和ftell()。8.3文件操作的常用函数语言程序设计第八章文件C(1)改变文件位置指针函数fseek()fseek(fp,Offset,position);其中:fp为文件型指针;position为起始点,指出以文件的什么位置为基准进行移动。position的值用整常数表示。ANSIC允许它有下列三个值之一:0——文件的开头;1——文件的当前位置;2——文件的末尾。Offset为位移量,指从起始点position到要确定的新位置的字节数。也就是以起点为基准,向前移动的字节数。ANSIC要求该参数为长整型量。函数功能:将文件fp的读写位置指针移到离开起始位置(position)的Offset字节处位置;如果函数读写指针移动失败,返回值为-1。

8.3.4文件的随机读写及其范例8.3文件操作的常用函数语言程序设计第八章文件C下面是几个fseek函数调用的实例:fseek(fp,50L,0);将位置指针从文件头开始向文件结束方向移动50个字节;fseek(fp,100L,1);将位置指针从当前位置向前(文件结束方向)移动100个字节fseek(fp,-20L,2);将位置指针从文件末尾文件头方向移动20个字节说明:fseek()函数一般用于二进制文件。在文本文件中,由于要进行转换,故计算的位置往往会计算不准。

8.3.4文件的随机读写及其范例8.3文件操作的常用函数语言程序设计第八章文件C【例8-6】实现对一个文本文件内容的反向显示。程序源代码如下:#include"stdio.h"main(){charc;FILE*fp;

clrscr();

if((fp=fopen(“d:\\t1.txt","r"))==NULL)/*以只读方式打开文本文件*/{

printf("Cannotopenfile.\n");exit(1);}

8.3.4文件的随机读写及其范例EX8_6.c演示8.3文件操作的常用函数语言程序设计第八章文件C

fseek(fp,0L,2);/*定位文件尾。是定位文件的最后一个字符之后的位置*/while((fseek(fp,-1L,1))!=-1)/*相对当前位置退后一个字节*/{

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论