C语言第7章-文件及应用.ppt

上传人:小飞机 文档编号:5426480 上传时间:2023-07-05 格式:PPT 页数:31 大小:812KB
返回 下载 相关 举报
C语言第7章-文件及应用.ppt_第1页
第1页 / 共31页
C语言第7章-文件及应用.ppt_第2页
第2页 / 共31页
C语言第7章-文件及应用.ppt_第3页
第3页 / 共31页
C语言第7章-文件及应用.ppt_第4页
第4页 / 共31页
C语言第7章-文件及应用.ppt_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《C语言第7章-文件及应用.ppt》由会员分享,可在线阅读,更多相关《C语言第7章-文件及应用.ppt(31页珍藏版)》请在三一办公上搜索。

1、第七章文件及应用,兰州理工大学,第七章 文件及应用,7.1 C语言文件的概念7.2 文件操作7.3 非缓冲文件系统,7.1 C语言文件的概念,文件是一组存储在外部设备上的数据的集合。每个文件都有一个文件名,操作系统以树状的目录(或称文件夹)管理文件。使用文件可以:大量、永久地保存信息;便于数据共享;,文件的分类:按文件的逻辑结构:记录文件:由定长或不定长的记录组成;流式文件:由一个个字符(字节)数据顺序组成按存储介质:普通文件(磁盘文件):存储介质文件(磁盘、磁带、光盘等);设备文件:非存储介质(键盘、显示器、打印机等)。按数据的组织形式:文本(ASCII码)文件:每个字节存放一个字符的ASC

2、II码;二进制文件:数据按其在内存中的存储形式原样存放。,UNIX C标准定义了两套I/O操作方法:缓冲文件系统(buffered file system),也可称为格式化的(formatted)或高级(high level)文件系统;非缓冲(unbuffered)文件系统,也可称非格式化的(unformatted)文件系统,只存在于UNIX标准中。ANSI C标准仅定义了缓冲文件系统。本章集中讨论ANSI C文件系统。,7.1.1 ANSI C的I/O和UNIX C的I/O,Disk,内存,Buffer,C语言为实现设备无关性(各种不同的设备和磁盘文件等同),提供了称为流的抽象。流是由数据字

3、节序列组成的。每一个C流与一个文件相连。流的模式共有两类:文本流(text);二进制(binary)(比特)流。通常把显示器定义为标准输出文件,使用printf,putchar函数对其输出。键盘通常被指定标准的输入文件,使用scanf,getchar函数输入。,7.1.2 流和文件,文件还可以分为:随机存取文件,如磁盘文件;顺序存取文件,如键盘。支持随机存取的文件,打开文件时也初始化文件位置指示(File Position Indicator),将其置为文件开始处,随着对文件的读写再对其增量或减量,确保访问的正确推进。,7.1.3 C语言文件,与文件相联的每个流都有一个FILE类型的控制结构,

4、通常称为文件指针。在stdio.h 中定义,用户绝对不能修改。,7.1.3 C语言文件,typedef struct int level;/*缓冲区“满”或“空”的程度*/unsigned flags;/*文件状态标志*/char fd;/*文件描述符*/unsigned char hold;/*如无缓冲区不读取字符*/int bsize;/*缓冲区大小*/unsigned char*buffer;/*数据缓冲区位置*/unsigned char*curp;/*文件定位指针*/unsigned istemp;/*临时文件指示器*/short token;/*用于有效性检查*/FILE;,7.2

5、 文件操作,文件的操作包括了几个基本步骤:1)定义文件结构体类型指针;2)打开文件;3)文件的读/写(追加)操作;4)关闭文件。,声明一个文件结构体类型指针的形式是:FILE*文件结构体指针名;例如:FILE*fp1,*fp2;声明了两个指向文件的文件指针变量。,7.2.1 定义文件结构体类型的指针,文件的一般处理过程,7.2.2 用于文件操作的函数,7.2.2 用于文件操作的函数,UNIX I/O函数(非缓冲文件系统)大多没有前缀f。,用于文件操作的函数原型声明在stdio.h中。,系统定义宏EOF为整数1,当读到文件尾时的返回该值。,1文件的打开与关闭函数1)打开文件 FILE*fopen

6、(char*filename,char*mode);例:FILE*fp=fopen(test,rw);filename是包含的路径文件名mode是打开方式,见表:返回值为指向此文件的指针,以后使用。如果打开失败,返回值为NULL。,7.2.2 用于文件操作的函数,1文件的打开与关闭函数2)关闭文件函数fclose()关闭由fopen()函数打开的流。fclose()函数把遗留在缓冲区的数据写入文件,实施操作系统级的关闭操作。同时释放与流联系的文件控制块。,7.2.2 用于文件操作的函数,2文件的读写函数1)字符读写函数:int fputc(int ch,FILE*fp);int fgetc(F

7、ILE*fp);2)串读写函数int fputs(const char*str,FILE*fp);char*fgets(char*str,int length,FILE*fp);,7.2.2 用于文件操作的函数,【例7.6】统计文本文件中的字符个数。,7.2.2 用于文件操作的函数,/*功 能:统计一个文本文件中字符的个数*/*说 明:文件名从命令行输入*/#include stdio.hmain(int argc,char*argv)FILE*fp;int count=0;if(fp=fopen(argv1,r)=NULL)printf(cant open file%s.,argv1);ex

8、it(1);/文件打开失败,退出/文件成功打开,从文件中读取字符 while(fgetc(fp)!=EOF)/按字符读文件并对读入字符数进行 count+;/统计,直到遇到文件结束符为止 fclose(fp);printf(file%s contains%d characters.n,argv1,count);,【例7.8】将键盘输入的串写入文件test中。,7.2.2 用于文件操作的函数,/*功 能:建立一个文本文件*/*说 明:使用函数gets()*/#include stdio.h#include string.hvoid main(void)char str80;FILE*fp;if(

9、fp=fopen(c:test,w)=NULL)printf(不能打开文件!n);exit(1);do printf(输入一个字串(空回车结束):n);gets(str);strcat(str,n);/*加上一个新行符n*/fputs(str,fp);/*写出到文件中*/while(*str!=n);/*当输入空串时结束*/,2文件的读写函数3)格式读写函数fprintf()和fscanf()int fprintf(FILE*fp,const char*format,);char*fscanf(FILE*fp,const char*format,);4)块读写函数fwrite()和fread(

10、)int fwrite(void*buf,size_t size,size_t count,FILE*fp);int fread(void*buf,size_t size,size_t count,FILE*fp);,7.2.2 用于文件操作的函数,【例7.11】建立一个学生通讯录的数据库文件。,7.2.2 用于文件操作的函数,/*功 能:建立一个学生通讯录的数据库文件*/*说 明:使用格式输出函数fprintf()*/#include stdio.hmain()FILE*fp;char ch;struct mail char name9;char sex3;char birth12;char

11、 local5;char phone8;char postcode7;char addr20;st;if(fp=fopen(mail,w)=NULL)printf(file open failed!n);exit(0);,fprintf(fp,%10.8s%6.4s%12.10s%6.4s%9.7s%8.6s%13.10sn,“姓 名”,“性 别,出生日期,区号,电 话,邮政编码,通讯地址);fprintf(fp,-n);while(1)printf(姓名:);scanf(%s,st.name);printf(性别(男 or 女):);scanf(%s,st.sex);printf(出生日期(

12、yyyy-mm-dd):);scanf(%s,st.birth);printf(区号 xxxx:);scanf(%s,st.local);printf(电话 xxxxxxx:);scanf(%s,st.phone);printf(邮政编码:);scanf(%s,st.postcode);printf(通讯地址:);scanf(%s,st.addr);/*按特定的格式写出数据到文件*/fprintf(fp,%10.8s%6.4s%12.10s%6.4s%9.7s%8.6s%sn,st.name,st.sex,st.birth,st.local,st.phone,st.postcode,st.ad

13、dr);printf(Strike E or e to end enter?n);ch=getch();if(ch=e|ch=E)break;fclose(fp);,【例7.15】如例7.11,用块写函数来建立学生通讯录。,7.2.2 用于文件操作的函数,/*功 能:建立一个学生通讯录的数据库文件*/*说 明:使用块写入函数fwrite()*/#include stdio.hmain()FILE*fp;char ch;struct mail char name9;char sex3;char birth12;char local5;char phone8;char postcode9;char

14、 addr20;st;if(fp=fopen(mail,wb)=NULL)printf(file open failed!n);exit(0);,while(1)printf(姓名:);scanf(%s,st.name);printf(性别(男 or 女):);scanf(%s,st.sex);printf(出生日期(yyyy-mm-dd):);scanf(%s,st.birth);printf(区号 xxxx:);scanf(%s,st.local);printf(电话 xxxxxxx:);scanf(%s,st.phone);printf(邮政编码:);scanf(%s,st.postco

15、de);printf(通讯地址:);scanf(%s,st.addr);/*按特定的格式写出数据到文件*/if(fwrite(,【例7.17】用块读函数来读出并显示学生通讯录。,7.2.2 用于文件操作的函数,/*功 能:读出并显示学生通讯录的数据库文件*/*说 明:使用块输出函数fread()*/#include stdio.hmain()FILE*fp;char ch;struct mail char name9;char sex3;char birth12;char local5;char phone8;char postcode9;char addr20;st;if(fp=fopen(

16、mail,rb)=NULL)printf(file open failed!n);exit(0);,while(!feof(fp)if(fread(,3文件的定位此前的文件操作均是顺序读写操作。通过改变文件位置指针,可在文件的任意位置进行读写操作,即随机读写操作。文件位置指针总指向当前读写位置,每读取一个数据,就自动向下移动(该数据的长度)。文件定位函数改变文件位置指针的位置:void rewind(FILE*stream);int fseek(FILE*stream,long offset,int origin);long ftell(FILE*stream);,7.2.2 用于文件操作的函

17、数,文件位置指针返回到文件头,移动文件位置指针:Offset(偏移量);Origin(基准):SEEK_SET(0)从文件的开头;SEEK_CUR(1)从文件当前位置;SEEK_END(2)从文件的末尾。,取文件位置指针:返回当前位置值(字节数)。出错时返回1。,4文件的检测函数1)int feof(FILE*stream);函数feof()检查文件位置指示,到达文件尾时返回非零值,否则返回零值。到达文件尾后,一切后续读操作均返回EOF,直到调用rewind()或用fseek()改变位置指示。操作二进制(binary)文件时,必须直接调用feof(),由此确定是否到达二进制文件的结尾。2)in

18、t ferror(FILE*stream);检查文件错误。返回值0表示无错,非零表示有错。与stream关联的错误标志保持置位,直到关闭文件或调用rewind()/clearerr()为止。,7.2.2 用于文件操作的函数,【例7.17】用块读函数来读出并显示学生通讯录。,7.2.2 用于文件操作的函数,/*功 能:读出并显示学生通讯录的数据库文件*/*说 明:使用格式输出函数fprintf()*/#include stdio.hmain()FILE*fp;char ch;struct mail char name9;char sex3;char birth12;char local5;cha

19、r phone8;char postcode9;char addr20;st;if(fp=fopen(mail,rb)=NULL)printf(file open failed!n);exit(0);,while(!feof(fp)if(fread(,fseek(fp,sizeof(struct mail),SEEK_SET);fread(,例:在屏幕上显示文件file1.c的内容,并将文件file1.c复制到文件file2.c。,7.2.2 用于文件操作的函数,#include main()FILE*fp1,*fp2;fp1=fopen(file1.c,r);fp2=fopen(file2.c,w);while(!feof(fp1)/*显示file1.c的内容*/putchar(fgetc(fp1);/*feof判断文件是否结束*/rewind(fp1);/*位置指针重返回文件头*/while(!feof(fp1)fputc(fgetc(fp1),fp2);/*复制文件内容*/fclose(fp1);fclose(fp2);,7.3 非缓冲文件系统,非缓冲文件系统是在UNIX操作系统环境下的C语言文件I/O系统。非缓冲文件系统的文件I/O函数主要有:,缓冲文件系统和非缓冲文件系统的区别:,作 业 题,Page 1855、6、8,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号