《北京邮电大学C语言课件第10章.ppt》由会员分享,可在线阅读,更多相关《北京邮电大学C语言课件第10章.ppt(28页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、C 语言程序设计教程07-May-23第10章 文件 11.1 文件概述 11.2 标准文件操作第十章 文件第一页,编辑于星期日:五点 七分。1C 语言程序设计教程07-May-23第10章 文件 在程序运行时,程序本身和数据一般都存放在内存中。当程序运行结束后,存放在内存中的数据被释放。如果需要长期保存程序运行所需的原始数据,或程序运行产生的结果,就必须以文件形式存储到外部存储介质上。一、文件与文件名 文件是指存放在外部存储介质上的数据集合。为标识一个文件,每个文件都必须有一个文件名,其一般结构为:主文件名.扩展名 文件命名规则,遵循操作系统的约定。11.1 文件概述 第二页,编辑于星期日:
2、五点 七分。2C 语言程序设计教程07-May-23第10章 文件二、数据文件的存储形式 数据文件用于保存数据,其读写往往由应用程序实现。1、字符文件:也称文本文件或正文文件,其数据以字符的形式出现,每个字符用一个 ASCII 代码(占一个字节)表示。2、二进制文件:以数据在内存中的形式原样存于磁盘。在Turbo C中,二进制文件中,整型数用2个字节表示,长整型用4个字节表示,实型数(浮点数)用4个字节,双精度数用8个字节表示。第三页,编辑于星期日:五点 七分。3C 语言程序设计教程07-May-23第10章 文件例:十进 制 整 数10000,在 内 存 中 占 两 字节,其 存 放 形 式
3、是:0010,0111,0001,0000。在 二进 制 文 件 中 也 按这 中 方式 存 放,占2个 字节。在ASCII 文 件 中,存 放为31H、30H、30H、30H、30H,占5个 字节,它们 分别 是1、0、0、0、0、0字母的ASCII码。第四页,编辑于星期日:五点 七分。4C 语言程序设计教程07-May-23第10章 文件比较:字符文件的每1个字节存储1个字符,因而便于对字符进行逐个处理。但一般占用存储空间较多,而且要花费转换时间(二进制与ASCII码之间的转换)。二进制文件是把内存中的数据,原样输出到磁盘文件中。可以节省存储空间和转换时间,但1个字节并不对应1个字符,不能
4、直接输出字符形式。第五页,编辑于星期日:五点 七分。5C 语言程序设计教程07-May-23第10章 文件三、标准文件与非标准文件1、标准文件系统:利用缓冲区将对磁盘文件进行操作的文件系统称为缓冲(或高层)文件系统,用户使用方便。从内存向磁盘输出数据时,必须首先输出到缓冲区中。待缓冲区装满后,再一起输出到磁盘文件中。从磁盘文件向内存读入数据时,则正好相反:首先将一批数据读入到缓冲区中,再从缓冲区中将数据逐个送到程序数据区。2、非标准文件系统:不使用缓冲区的磁盘文件系统称为非缓冲(或低层)文件系统。编程难度较大,但程序的执行效率高,占用内存资源较少。第六页,编辑于星期日:五点 七分。6C 语言程
5、序设计教程07-May-23第10章 文件 在C语言中,无论是使用标准文件系统还是非标准文件系统,都是利用I/O库函数完成文件操作的。程序数据区输出文件缓冲区输出输入输入文件缓冲区输出输入磁盘内存第七页,编辑于星期日:五点 七分。7C 语言程序设计教程07-May-23第10章 文件 要调用一个文件,需要有以下的信息:文件当前的读写位置 与该文件对应的内存缓冲区的地址 文件操作方式等 1、每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息。这些信息是保存在一个结构体类型的变量中。该结构体类型是由系统定义的,取名为FILE。2、标准文件系统借助FILE数据结构对文件进行管理,利用文件指
6、针读写文件。每当程序成功打开一个文件,系统就在内存建立一个与该文件对应的FILE结构体变量,并返回该变量的指针(地址)。11.2 标准文件操作一、标准文件FILE结构指针 第八页,编辑于星期日:五点 七分。8C 语言程序设计教程07-May-23第10章 文件3、在程序中定义一个指针变量,用以保存已打开文件所对应的FILE结构在内存的地址,此后用户程序就可用此FILE指针来实现对指定文件的存取操作。定义文件指针变量的一般形式为:FILE*文件结构指针变量名 例如:FILE*fp;注意:1)只有通过文件指针,才能调用相应的文件。2)对文件操作的库函数,函数原型均在头文件stdio.h中。3)文件
7、操作的过程:对磁盘文件的操作必须“先打开,再读写,最后关闭”。第九页,编辑于星期日:五点 七分。9C 语言程序设计教程07-May-23第10章 文件“打开”文件的含义:以某中方式从磁盘上查找指定的文件或 创建一个新文件。1、文件的打开(fopen)函数形式:FILE*fopen(char*filename,char*mode);filename:文件名(可以包含驱动器、路径、文件名、扩展名)mode:打开方式 FILE*:返回值1)如果成功打开,返回一个指向被打开文件的文件信息区的起始地址;2)如果打开失败,返回一个NULL指针。二、标准文件的打开操作 第十页,编辑于星期日:五点 七分。10
8、C 语言程序设计教程07-May-23第10章 文件“r”(只读)为输入打开一个文本文件“w”(只写)为输出打开一个文本文件“a”(追加)向文本文件尾增加数据“rb”(只读)为输入打开一个二进制文件“wb”(只写)为输出打开一个二进制文件“ab”(追加)向二进制文件尾增加数据“r+”(读写)为读/写打开一个文本文件“w+”(读写)为读/写建立一个新的文本文件“a+”(读写)为读/写打开一个文本文件“rb+”(读写)为读/写打开一个二进制文件“wb+”(读写)为读/写建立一个新的二进制文件“ab+”(读写)为读/写打开一个二进制文件2、文件打开方式参数第十一页,编辑于星期日:五点 七分。11C
9、语言程序设计教程07-May-23第10章 文件3、在程序开始运行时,系统自动打开以下标准文件,并自动地定义了对应的FILE 结构指针变量。第十二页,编辑于星期日:五点 七分。12C 语言程序设计教程07-May-23第10章 文件4、说明:1)用“r”方式打开的文件应该已经存在,如果不存在则打开失败;2)用“w”方式打开的文件,如果不存在该文件,则新建立一个,如果存在该文件,则在打开时将该文件删去,然后重新建立一个新文件;3)如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”方式打开;4)如果不能实现“打开”的任务,fopen函数的返回值是一个NULL空指针。(其值在头文件
10、stdio.h中被定义为)第十三页,编辑于星期日:五点 七分。13C 语言程序设计教程07-May-23第10章 文件为增强程序的可靠性,常用下面的方法打开一个文件:if(fp=fopen(文件名,操作方式)=NULL)printf(can not open this filen);exit(0);关于exit()函数1)用法:void exit(程序状态值);2)功能:关闭已打开的所有文件,结束程序运行,返回操作系统,并将“程序状态值”返回给操作系统。当“程序状态值”为时,表示程序正常退出;非值时,表示程序出错退出。第十四页,编辑于星期日:五点 七分。14C 语言程序设计教程07-May-2
11、3第10章 文件三、关闭标准文件 程序对文件的读写操作完成后,必须关闭文件,以保证文件的完整性。格式:fclose(文件指针);1、fclose(fp);关闭 fp所指的文件,并返回一个整数值。若成功地关闭了文件,则返回一个0值;否则返回一 个非零值。2、fcloseall();同时关闭程序中已打开的多个文件(标准设备文件除 外),将各文件缓冲区未装满的内容写到相应的文件中 去,并释放这些缓冲区,返回关闭文件的数目。第十五页,编辑于星期日:五点 七分。15C 语言程序设计教程07-May-23第10章 文件四、标准文件的读写操作 1、字符读写函数 fgetc和fputc int fputc(i
12、nt c,FILE*fp)-把字符c写入fp所指的文件 int fgetc(FILE*fp)-从fp所指的文件中读一个字符,返回读得的字符。对于文本文件,遇文件尾时返回EOF。(其值在头文件stdio.h中被定义为-1)。对于二进制文件,用feof(fp)判别是否遇文件尾。feof(fp)=1说明遇文件尾。第十六页,编辑于星期日:五点 七分。16C 语言程序设计教程07-May-23第10章 文件例1、函数fgetc和fputc的使用#include stdio.h#include conio.hmain()FILE*fp1,*fp2;char file120,file220;char ch;
13、clrscr();printf(please input file1s name:);scanf(%s,file1);fp1=fopen(file1,r);第十七页,编辑于星期日:五点 七分。17C 语言程序设计教程07-May-23第10章 文件 if(fp1=NULL)printf(can not open this filen);exit(0);printf(please input file2s name:);scanf(%s,file2);fp2=fopen(file2,w);if(fp2=NULL)printf(can not open this filen);exit(0);ch
14、=fgetc(fp1);while(ch!=EOF)fputc(ch,fp2);ch=fgetc(fp1);fclose(fp1);fclose(fp2);第十八页,编辑于星期日:五点 七分。18C 语言程序设计教程07-May-23第10章 文件 2、字符串读写函数 fgets和fputs 库函数fputs()向fp所指文件输出一个字符串 1)用法:int fputs(const char*str,FILE*fp)2)功能:把str写入fp所指的文件。库函数fgets()从文件中读一个字符串 1)用法:char*fgets(char*str,int n,FILE*fp);2)功能:从fp所指
15、的文件中读n-1个字节到str,str最后一个字节加0。如果在读入规定长度之前遇到文件尾EOF或换行符,读入即结束。第十九页,编辑于星期日:五点 七分。19C 语言程序设计教程07-May-23第10章 文件 例2、函数fputs 和fgets 的使用#include main()FILE*fp;char*ch1=How are you!;char ch220;clrscr();fp=fopen(“d:infile.txt,w+);if(fp=NULL)printf(“can not open this filen);exit(0);fputs(ch1,fp);rewind(fp);/*用于把
16、文件指针移到文件的开头。*/fgets(ch2,strlen(ch)+1,fp);printf(%s,ch2);第二十页,编辑于星期日:五点 七分。20C 语言程序设计教程07-May-23第10章 文件 3、格式化读写函数 fscanf和fprintf 形式:fprintf(文件指针,格式控制,变量列表);fscanf(文件指针,格式控制,变量地址列表);除增加“文件指针”外,与scanf()和printf()函数的功能相似。例如:.int i=3;float f=9.80;.fprintf(fp,%2d,%6.2f,i,f);.fprintf()函数的作用是,将变量i按%2d格式、变量f按
17、%6.2f格式,以逗号作分隔符,输出到fp所指向的文件中:3,9.80(表示1个空格)。第二十一页,编辑于星期日:五点 七分。21 例3、函数fscanf和fprintf的使用 main()FILE*fpr,*fpw;int j;clrscr();fpr=fopen(d:creatr.txt,r);fpw=fopen(d:creatw.txt,“w);if(fpr=NULL|fpw=NULL)printf(can not open filen);exit(0);#define number 3#include#include typedef struct long num;char name1
18、0;int age;student;student testnumber;for(j=0;jnumber;j+)fscanf(fpr,%ld%s%d,&testj.num,testj.name,&testj.age);for(j=0;jnumber;j+)fprintf(fpw,%ld,%s,%dn,testj.num,testj.name,testj.age);第二十二页,编辑于星期日:五点 七分。22C 语言程序设计教程07-May-23第10章 文件int fwrite(void*buffer,unsigned size,unsigned count,FILE*fp);将buffer地址
19、开始的信息,写入count次,每次写size字节至文件fp中。函数返回值等于实际写入的次数(可能少于count)。typedef struct long num;char name10;int age;student;student stu3;for(j=0;jnumber;j+)fwrite(&stuj,sizeof(student),1,fp);4、读写一个数据块fread()fwrite()第二十三页,编辑于星期日:五点 七分。23C 语言程序设计教程07-May-23第10章 文件int fread(void*buffer,unsigned size,unsigned count,FI
20、LE*fp);从文件fp中读入count次,每次读size字节,读入的信息存在buffer指针指向的缓冲区。函数返回值等于实际读入的次数(可能少于count)。typedef struct long num;char name10;int age;student;student test3;作用:按数据项(即数据块)进行操作,通过它们可以方便地对程序中的数组、结构体数据进行整体输入输出。函数操作完成后,将返回读出或写入的数据项项数。for(j=0;jnumber;j+)fread(&testj,sizeof(student),1,fp);第二十四页,编辑于星期日:五点 七分。24C 语言程序设
21、计教程07-May-23第10章 文件读写函数的选用原则:从功能角度来说,fread()和fwrite()函数可以完成文件的任何数据读写操作。但为方便起见,依下列原则选用:1)读/写1个字符(或字节)数据时:选用fgetc()和fputc()函数。2)读/写1个字符串时:选用fgets()和fputs()函数。3)整体读/写结构体或数组时:选用fread()和fwrite()函数。4)读/写1个(或多个)含格式的数据时:选用fscanf()和fprintf()函数。第二十五页,编辑于星期日:五点 七分。25C 语言程序设计教程07-May-23第10章 文件文件的操作步骤:1)定义文件指针(F
22、ILE);2)建立文件指针和文件名的关系(fopen);3)进行读或写操作;4)关闭文件(fclose)。例如:要将文本文件1中字符复制到文件2中,定义内存变量ch和两个文件指针fp1和fp2,反复执行ch=fgetc(fp1)和fputc(ch,fp2)语句直到feof(fp1)为真止。fp1文件2内存变量文件1fp2ch=fgetc(fp1)fputc(ch,fp1)第二十六页,编辑于星期日:五点 七分。26C 语言程序设计教程07-May-23第10章 文件 文件中有一个位置指针,指向当前读写的位置。我们可以使用有关函数来改变其位置,以完成文件的随机读写。四、标准文件的定位函数 fsee
23、k()函数:调用形式为:fseek(文件类型指针,位移量,起始点)说明:位移量一般是long型数据;起始点用0、1或2表示;函数的作用:是使文件指针移动到所需的位置;若调用 成功,返回值为0;否则返回一个非零值。第二十七页,编辑于星期日:五点 七分。27C 语言程序设计教程07-May-23第10章 文件例如:fseek(fp,20L,0);把文件指针从文件开头移到第20个字节处。fseek(fp,-20L,2);把文件指针从文件尾向前移动 20 个字节。ftell()函数:调用形式为:ftell(文件类型指针)函数的作用:得到文件指针离开文件起点的字节数。若调用不成功,返回-1L,表示出错。例如:long i;i=ftell(fp);if(i=-1L)printf(“errorn”);rewind()函数:调用形式为:rewind(文件类型指针)函数的作用:用于把文件指针移到文件的开头。移动成功 时,返回值为0,否则返回一个非零值。第二十八页,编辑于星期日:五点 七分。28
限制150内