收藏 分享(赏)

第十二章 文件2.ppt

上传人:hyngb9260 文档编号:7734319 上传时间:2019-05-24 格式:PPT 页数:35 大小:492.50KB
下载 相关 举报
第十二章 文件2.ppt_第1页
第1页 / 共35页
第十二章 文件2.ppt_第2页
第2页 / 共35页
第十二章 文件2.ppt_第3页
第3页 / 共35页
第十二章 文件2.ppt_第4页
第4页 / 共35页
第十二章 文件2.ppt_第5页
第5页 / 共35页
点击查看更多>>
资源描述

1、2019/5/24,第十二章 文件,2019/5/24,文件(File)是一组相关数据的有序集合。一般存储在外部介质上 文件的基本操作有打开、关闭和读写。通过它们可以创建、修改和读取各种文件 通常把输入输出设备也看作文件,如打印机和磁带文件等,2019/5/24,12.1 文件概述,12.1.1 文件的分类从用户的角度普通文件:存储在外部介质上的数据集合设备文件:与主机相连的外部设备 从文件数据的编码组织形式上ASCII码文件:字符文件 二进制文件:值文件 从文件的实现方式上缓冲文件:通过信息结构体读写 非缓冲文件:直接读写,2019/5/24,12.1.2 缓冲文件系统和非缓冲文件系统,1.

2、 缓冲文件系统 (1) 缓冲文件系统的操作逻辑结构,(a) 缓冲文件系统中的输入缓冲区文件操作逻辑,(b) 缓冲文件系统中的输出缓冲区文件操作逻辑,2019/5/24,(2) 缓冲文件系统的文件信息区结构及指向文件的指针,对文件进行操作时,需要知道文件的当前读写位置、与该文件对应的内存缓冲区地址、缓冲区中未被处理的字符数和文件操作方式等信息。缓冲文件系统在内存中为每一个文件开辟了一个文件信息区,它们由系统定义的文件结构体数据类型FILE表示。FILE结构体数据类型的定义包含在头文件中。,typedef struct short level; /*缓冲区状态级别*/unsigned flags;

3、 /*文件状态标记*/char fd; /*文件描述符*/unsigned char hold; /*Ungetc字符*/short bsize; /*缓冲区大小*/unsigned char *buffer; /*数据传输缓冲区*/unsigned char *curp; /*当前活动指针*/unsigned istemp; /*临时文件指示器*/short token; /*有效性检查Token*/ FILE; /*文件对象的信息描述结构体*/,2019/5/24,声明文件指针变量的格式:FILE *文件结构体指针变量名;,例如:FILE *fp1,*fp2,*fp3;声明了三个FILE型

4、指针变量。,注意: 缓冲文件系统中,所有对文件的操作都必须通过指向文件结构体指针变量完成 只要将文件信息对应的结构体变量之起始地址值赋给文件指针变量,就可以达到操作和管理文件的目的,2019/5/24,(3) 缓冲文件系统的读写文件方法 fgetc()和fputc() fgets()和fputs() fscanf()和fprintf() fread()和fwrite(),2019/5/24,没有FILE类型的结构体数据类型来描述文件信息,也没有相应的文件类型指针。它主要通过文件号对文件进行访问 直接依赖于操作系统的功能完成对文件的操作,故又称为低级输入输出系统或系统级输入输出系统 只能以块形式

5、进行读写,不能读写单个字符、字符串和格式化数据。用于二进制文件的输入输出 文件读写缓冲区的设置必须由用户自己设定,不是由编译器自动设置,(1) 特点,2. 非缓冲文件系统,2019/5/24,结论:输入输出缓冲区属于程序的一部分,其设置由程序编写者根据需要自行设定。该缓冲区通常以数组变量来担当。,(2) 操作逻辑结构,程序结构,用户数据区,输入输出缓冲区,(3) 读写方法 只能以块方式读写,即read()和write()方式,2019/5/24,3. 两种文件系统的比较,2019/5/24,12.2 文件打开与关闭,文件的操作步骤:先打开,后读写,再关闭,12.2.1 文件的打开,2. 文件打

6、开函数FILE *fopen(const char*path, const char*mode); 功能:按指定方式mode打开path路径所指定的文件。正常打开时,函数返回指向该文件的结构体指针;打开失败时,返回NULL 注意:默认的文件打开路径是当前路径,1. 在操作系统文件和应用程序之间建立起联系,如文件名称、对文件的操作方式等,例如: (1) fopen(“fs_1.txt“,“r“)以只读方式打开当前工作目录下的文件fs_1.txt (2) fopen(“fs_1“,“r“)以只读方式打开当前工作目录下的文件fs_1 (3) fopen(“d:tcfs_1“,“r“)打开D盘根目录下

7、的TC目录下的文件fs_1 (4) fopen(“fs_1“,“r“)打开当前磁盘下当前目录的上上一级目录下的文件fs_1,2019/5/24,2019/5/24,12.2.2 文件的关闭 文件关闭函数int fclose(FILE *stream); 功能:关闭指针stream所指向的文件。释放stream文件信息区存储空间。关闭失败时返回EOF值。例如:if (fclose(fp) printf(“Error in closing file %sn“, argv1); 注意:(1)磁盘满或移走等会导致fclose()失败。(2) 不关闭文件就结束程序执行会导致文件信息丢失。(3) fclo

8、se(fp)中的fp不能省略。,2019/5/24,12.3 文件的顺序读写模式 12.3.1 按字符读写文件 fputc()int fputc(int ch, FILE *stream); 功能:把一字节的ch写入文件stream中。写入正常时,返回ch;写入出错时,返回EOF。 fgetc()int fgetc(FILE *stream); 功能:从stream中读取一个字节的代码。正常读取时,返回读到的代码值;读到文件尾或出错时返回EOF。,2019/5/24,例12-1 将键盘读入的内容存入一个磁盘文件。,#include #include int main(int argc,char

9、 *argv) FILE *fp;int ch;if (argc2) printf(“Give a filename to be operated,please.n“);return 0; /*if (argc2)*/if (fp=fopen(argv1,“w“)=NULL) printf(“fopen() failed!n“); exit(0); /*if (fp=fopen()=NULL)*/while (ch=getchar()!=EOF) fputc(ch,fp); fclose(fp); /*关闭文件fp*/return 0; /*End of main()*/,D:TCTCexam

10、1201 fs_file This is a program to read information from keyboard and write them into the file “fs_file“ using function fputc() Z D:TCTCtype fs_file This is a program to read information from keyboard and write them into the file “fs_file“ using function fputc(),2019/5/24,例12-2 将例12-1生成的文件内容用fgetc()读

11、出和显示。,#include #include int main(int argc,char *argv) FILE *fp;int ch;if (argc2) printf(“Give a filename to be operated,please.n“);return 0; /*if (argc2)*/if (fp=fopen(argv1,“r“)=NULL) printf(“fopen() failed!n“); exit(0); /*if (fp=fopen()=NULL)*/while (ch=fgetc(fp)!=EOF) putchar(ch); fclose(fp); ret

12、urn 0; /*End of main()*/,D:TCTCexam1202 fs_file This is a program to read information from keyboard and write them into the file “fs_file“ using function fputc(),2019/5/24,注意: EOF是常量值-1,fgetc()读入的是int值。当读取的内容不是ASCII码而是2#值时,-1是值而不是字符编码。不能用EOF作文件结束符判断标志。 ANSI C提供了专门判断是否遇到文件结束符的函数feof()。如果eof()返回的值为1,说

13、明文件的读写遇到了文件结束符,为0时表示还没有遇到文件结束符。 文件结束与否的常见判断形式:while (foef(fp)=0) while (!feof(fp) ,2019/5/24,12.3.2 按字符串读写文件,fgets()char*fgets(char*str,int n,FILE*stream); 功能:从stream获取n-1个字符并将第n个字符置为0或在遇到n时结束读入动作并在后面加上0。读取结果存于str所在存储空间。读取成功时将str首地址作为函数返回值,否则返回NULL。 fputs()int fputs(const char *str,FILE *stream); 功能

14、:将串str写入文件stream。 0不属于文件内容,它不写入文件。,2019/5/24,例12-3 将例12-1创建的磁盘文件内容读出并在屏幕上显示出来。,#include #include #define MAX_READ 20 int main(int argc,char *argv) FILE *fp;char str20;if (argc2) printf(“Give a filename to be operated,please.n“);return 0; /*if (argc2)*/if (fp=fopen(argv1,“r“)=NULL) printf(“fopen() fa

15、iled!n“); exit(0); /*if (fp=fopen()=NULL)*/while (fgets(str,MAX_READ,fp) fputs(str,stdout); fclose(fp); /*End of main()*/,注意:输出方法还有: 用putchar()输出i=0;while (stri!=n ,2019/5/24,12.3.3 格式化输入输出方式读写文件,int fscanf(FILE *stream,const char *format, .);int fprintf(FILE *stream,const char *format, .); 功能:按指定的格

16、式对文件stream进行读写操作。读写成功时,返回成功读写的数据项个数。读写出错或遇到文件尾时,返回EOF。,2019/5/24,例12-4 创建格式化数据磁盘文件。,例12-5 从例12-4所生成的格式化文件中读入其数据并显示出来。,D:TCTCexam1204 fs_form.txt Input name,age and score(End when age=0): Name:Liyi Age:20 Score:88 Name:Huangjie Age:20 Score:90 Name:Lijun Age:21 Score:87 Name:noname Age:0 Score:0,D:TC

17、TCtype fs_form.txt Liyi 20 88.00 Huangjie 20 90.00 Lijun 21 87.00 Noname 0 0.00,D:TCTCexam1205 fs_form.txt The formated file data are: Liyi 20 88.00 Huangjie 20 90.00 Lijun 21 87.00,2019/5/24,12.3.4 按数据块读写文件,size_t fread(void *ptr,size_t size,size_t n,FILE *stream);size_t fwrite(const void *ptr,size

18、_t size,size_t n,FILE *stream); 功能:按指定大小从ptr读/写n个数据块。成功时,返回已读/写的块数;出错或遇到文件尾时,返回0值。 注意1:fread()和fwrite()进行文件读写时,文件必须以2#方式打开。 注意2:ptr是要读写数据块的首地址,size为数据块的大小,n为要读写的数据块数,stream是要读写的文件指针。,2019/5/24,typedef struct /*学生信息数据类型*/ char cName20;unsigned uAge;float fScore; stud_type; /*stud_type*/,例12-6 用fwrite

19、()创建一个学生信息数据文件。,例12-7 读出用fwrite() 创建的学生信息数据文件中的记录内容并显示。,2019/5/24,12.4 文件的随机读写模式 顺序读写只能按物理顺序进行读写。如果只读取中间某项数据或从指定位置开始读取,顺序读取是不方便的。 C语言文件系统提供了不按物理顺序而按任意指定位置进行读写的操作方式。只要移动当前读写位置指针curp,即可实现按指定位置进行读写,即随机读写。,2019/5/24,12.4.1 文件当前读写位置的指定,1. fseek()int fseek(FILE *stream, long offset, int whence); 功能:改变文件的当

20、前读写位置指针。成功时返回0;失败时返回非0值。 注意:offset表示当前读写位置指针curp的相对位移。正数表示向文件尾部移动,负数表示向文件头部移动。whence表示指针移动的起点位置。0表示从文件头部开始,1表示从当前位置开始,2表示从文件尾部开始。例如:(1) fseek(fp,10L,0) (2) fseek(fp,-20L,1) (3) fseek(fp,-50L,2),2019/5/24,2. ftell()long ftell(FILE *stream); 功能:返回文件的当前读写位置。如果出错,返回-1值。,3. rewind()void rewind(FILE *stre

21、am); 功能:重置文件指针到文件开始处。它没有函数返回值。,2019/5/24,例如:磁盘文件上有3个学生数据,要求读入第1个和第3个学生的数据并显示,#include struct student_type int num;char name10;int age;char addr15; stud3;,12.4.2 文件的随机读写实例,void main() int i;FILE *fp;if (fp=fopen(“studat“,“rb“)=NULL) printf(“cant open filen“);exit(0);for(i=0;i3;i+=2) fseek(fp,i*sizeof

22、(struct student_type),0);fread( /*End of main()*/,2019/5/24,#include“stdio.h“ void main() FILE *fp;char filename80;long length;gets(filename);fp=fopen(filename,“rb“);if(fp=NULL) printf(“file not found!n“);else fseek(fp,0L,SEEK_END); /*SEEK_END=2*/length=ftell(fp);printf(“Length of File is %1d bytesn

23、“,length);fclose(fp); /*if*/ /*End of main()*/,例如:计算一个文件的字节长度,2019/5/24,例12-8* 对例12-6创建的数据文件,修改其第二和第三个记录,并在尾部学生记录,然后显示修改后的文件记录。要求在文件尾部的数据结束标记记录始终保持。,例12-9 用fread()和fwrite()将一个磁盘文件的内容复制到另一个磁盘文件。,2019/5/24,12.5 非缓冲文件的读写方法* 没有文件信息结构体和指向文件类型的指针;读写缓冲区由应用程序设置;文件打开命令的返回值是一个整数;读写方式只能是块读写。 直接依赖于操作系统的输入输出功能(系

24、统级输入输出),ANSI标准不再包含它。 非缓冲文件系统功能的参数和函数原型的声明包含在头文件中。,2019/5/24,1. 文件的打开和关闭int open(const char*path,int access,);int close(int handle); 注意1:path要打开的文件名,可带路径,默认路径为当前目录。access访问方式。分为只读、只写和可读写三种模式,用数字1,2,3或宏名O-RDONLY,O-WRONLY, O-RDWR表示()。返回值代表文件标识号或文件号。打开失败时返回值为-1。 注意2:宏名所定义的读写模式为1,2,4。文件标识号又称为句柄(handle)。,

25、2019/5/24,2. 文件的读写方法int read(int handle,void *buf,unsigned len);int write(int handle,void *buf,unsigned len); 注意1:handle文件标句柄;buf读入内容存放的缓冲区首地址或待写入文件的存储区首地址;len一次读写的最大字节数。函数返回实际读写的字节数。 注意2:read()返回值为0时表示意读到文件尾,为-1时表示读入操作失败,否则为实际读入字节数。 write()返回实际写入字节数,如果为-1表示写入失败。,2019/5/24,3. 缓冲区的设置 注意:一般以512字节或其整数倍数大小为基础。缓冲区不宜太大,也不能太小,4. 非缓冲技术的应用实例 例12-10 利用非缓冲文件系统方法显示一个文件的内容。,2019/5/24,小结,文件系统是程序设计的重要技术内容。它分为缓冲文件系统和非缓冲文件系统。前者称为高级输入输出系统,后者称为低级输入输出系统。 缓冲文件系统既可读写文本文件,也可读写2#文件。读写效率比非缓冲区文件略低,但其读写方式丰富,缓冲区自动设定,使用起来很方便。 缓冲文件系统主要由FILE文件信息结构体、指向文件的指针及文件打开、关闭和读写等系列函数构成。运用时要注意打开和关闭的成对匹配。,2019/5/24,谢谢观看!,The End,

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

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

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


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

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

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