C语言程序设计第十章.ppt

上传人:wuy****n92 文档编号:70099932 上传时间:2023-01-16 格式:PPT 页数:29 大小:296.49KB
返回 下载 相关 举报
C语言程序设计第十章.ppt_第1页
第1页 / 共29页
C语言程序设计第十章.ppt_第2页
第2页 / 共29页
点击查看更多>>
资源描述

《C语言程序设计第十章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计第十章.ppt(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第十章 文件C10.1 概述文件:存储在外部介质上数据的集合,是操作系统数据管理的单位使用数据文件的目的数据文件的改动不引起程序的改动程序与数据分离不同程序可以访问同一数据文件中的数据数据共享能长期保存程序运行的中间数据或结果数据C概述C语言把文件看作一个字节序列,即由一连串的字节组成,称为“流(stream)”,以字节为单位访问,没有记录的界限文件分类 按文件的逻辑结构:F记录文件:由具有一定结构的记录组成(定长和不定长)F流式文件:由一个个字符(字节)数据顺序组成 按存储介质:F普通文件:存储介质文件(磁盘、磁带等)F设备文件:非存储介质(键盘、显示器、打印机等)按数据的组织形式:文本文件

2、:ASCII文件,每个字节存放一个字符的ASCII码二进制文件:数据按其在内存中的存储形式原样存放C如 int型数1000000100111 00010000内存存储形式二进制形式00110001 00110000 00110000 00110000 00110000ASCII形式文本文件特点:存储量大、速度慢、便于对字符操作二进制文件特点:存储量小、速度快、便于存放中间结果00100111 00010000C磁盘文件输出文件缓冲区输入文件缓冲区程序数据区a缓冲文件系统:缓冲区指令区程序用户数据区磁盘非缓冲文件系统:文件处理方法缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区

3、非缓冲文件系统:低级文件系统,由用户在程序中为每个文件设定缓冲区C10.2 文件类型指针 要调用一个文件,需要有以下的信息 文件当前的读写位置 与该文件对应的内存缓冲区的地址 缓冲区中未被处理的字符串 文件操作方式等 缓冲文件系统为每个正使用的文件在内存开辟文件信息区文件信息用系统定义的名为FILE的结构体描述FILE定义在stdio.h中 typedef struct int _fd;/*文件号*/int _cleft;/*缓冲区中剩下的字节数*/int _mode;/*文件操作模式*/char*_nextc;/*下一个字节的位置*/char*_buff;/*文件缓冲区位置*/FILE;C文

4、件类型指针文件名文件使用方式文件类型指针C程序操作系统磁盘文件类型指针指针变量说明:FILE *fp;用法:F文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息,访问文件F文件关闭后,它的文件结构体被释放C10.3 文件的打开与关闭F文件操作用库函数实现,包含在stdio.hF文件使用方式:打开文件-文件读/写-关闭文件F系统自动打开和关闭三个标准文件:标准输入-键盘 stdin标准输出-显示器 stdout标准出错输出-显示器 stderrC文件的打开 FILE *fopen(const char*filename,const char*mode);文件

5、名(可以包含逻辑驱动器、路径、文件名、扩展名)打开方式返回值功能:按指定方式从磁盘上查找指定的文件或创建一个新文件。返值:正常打开,为指向文件结构体的指针;打开失败,为NULL例:FILE*fp;fp=fopen(file1,r);如果成功打开,返回一个指向被打开文件的文件信息区的起始地址;如果打开失败,返回一个NULL指针。C文件的打开文件打开方式含义r(只读)为输入打开一个文本文件w(只写)为输出打开一个文本文件a(追加)为追加打开一个文本文件rb(只读)为输入打开一个二进制文件wb(只写)为输出打开一个二进制文件ab(追加)为追加打开一个二进制文件r+(读写)为读写打开一个文本文件w+(

6、读写)为读写创建一个文本文件a+(读写)为读写打开一个文本文件rb+(读写)为读写打开一个二进制文件wb+(读写)为读写创建一个二进制文件ab+(读写)为读写打开一个二进制文件C说明:打开文件的方式,必须与文件的属性兼容。例如,不能以“w”和“a”方式打开具有“只读”属性的文件。但可以以任何方式打开“隐藏”属性文件。DOS/Windows中,无“只写”文件属性,一个文件可写,同时意味着可读。用带“r”的方式(“r”、“rb”、“r+”、“rb+”)打开文件时,若文件不存在,则返回NULL指针。一般用以下方式检查是否成功打开:FILE*fp;if(fp=fopen(file1,r)=NULL)p

7、rintf(cannot open this filen);exit(0);/*exit(0)是程序返回操作系统*/C文件的打开在Turbo C2.0中,用带“a”或带“w”的方式打开文件时,若文件不存在,则创建该文件。但fopen()函数仍可能因为磁盘写保护或目录满而失败。在Turbo C2.0中,用带a或带w的方式打开文件时,若文件已存在,a方式在原文件后追加数据,w方式把原文件删除、并重新创建一个相同名字的文件。C文件的关闭 int fclose(FILE *fp)文件打开时返回的文件类型指针功能:关闭fp指向的文件,使文件指针变量与文件“脱钩”,释放文件结构体和文件指针返值:正常关闭为

8、0;出错时,非0磁盘文件输出文件缓冲区输入文件缓冲区程序数据区a缓冲文件系统:不关闭文件可能会丢失数据fcloseC10.4 文件的读写 fputc的函数原型为:int fputc(char ch,FILE *fp)作用:将ch中的字符输出到fp所指向的文件中,通常用于往文本文件中写入一个字符返回值:输出成功则返回所输出的字符,失败则返回EOF fgetc的函数原型为:int fgetc(FILE *fp)作用:从fp所指向的文件中读入一个字符返回值:返回所读的字符,如发生错误或读到文件结束符失败则返回EOFC例 从键盘输入字符,逐个存到磁盘文件中,直到输入#“为止#include main(

9、)FILE*fp;char ch,*filename=“out.txt”;if(fp=fopen(filename,w)=NULL)printf(cannot open filen);exit(0);printf(Please input string:);ch=getchar();while(ch!=#)fputc(ch,fp);putchar(ch);ch=getchar();fclose(fp);例 读文本文件内容,并显示#include main()FILE*fp;char ch,*filename=“out.txt”;if(fp=fopen(filename,”r)=NULL)pri

10、ntf(cannot open filen);exit(0);while(ch=fgetc(fp)!=EOF)putchar(ch);fclose(fp);判断文本文件是否结束C 判断二进制文件是否结束 while(!feof(fp)c=fgetc(fp);.例 文件拷贝 feof函数原型:int feof(FILE *fp)功能:判断文件是否结束返值:文件结束,返回真(非0);文件未结束,返回0#include main()FILE*in,*out;char ch,infile10,outfile10;scanf(%s,infile);scanf(%s,outfile);if(in=fope

11、n(infile,r)=NULL)printf(Cannot open infile.n);exit(0);if(out=fopen(outfile,w)=NULL)printf(Cannot open outfile.n);exit(0);while(!feof(in)fputc(fgetc(in),out);fclose(in);fclose(out);C fwrite的函数原型为:unsigned fwrite(void *buffer,unsigned size,unsigned count,FILE *fp)作用:将buffer所指向的内存单元开始的内存区中的长度为size的coun

12、t个数据项写入fp所指向的文件中返回值:调用成功则返回实际输入的数据项,即count的值fwrite函数主要用于二进制文件的写操作,可以将一个数据块(即一组数据)写到文件中。fread的函数原型为:unsigned fread(void *buffer,unsigned size,unsigned count,FILE *fp)作用:从fp所指向的文件中将读出每项长度为size的count个数据项,存放到buffer所指向的内存单元开始的存储区中返回值:返回实际所读出的数据项,即count的值fread函数主要用于二进制文件的读操作,从文件中读出一组数据。C如果文件以二进制形式打开,用frea

13、d和fwrite可以读写任何类型的信息。、若f 为float型数组,共10个元素:fread(f,4,10,fp);fread(f,sizeof(float),10,fp);fread(f,8,5,fp);fwrite(f,sizeof(float),10,fp);、若有结构体类型:struct student long num;char name;float score3;stu30;for(i=0;i30;i+)fwrite(&stui,sizeof(struct student),1,fp);for(i=0;i30;i+)fread(&stui,sizeof(struct student

14、),1,fp);C说明:、由fputc函数建立的文件,通常由fgetc函数读取,它们的操作对象均为字符,所以称为字符读写函数;、由fwrite函数建立的文件,通常由fread函数读取,它们以数据块为单位进行读写,所以称为块读写函数;关于文件追加的含义:追加数据时,文件中的原有数据仍然存在,新写入的数据写到原文件数据之后。打开文件时,系统内部存在一个位置指针,指出对数据操作的位置。用r、w、rb、wb打开文件时,位置指针指向文件开始处;读写时总是文件的第一个数据;用a、ab打开文件时,位置指针则指向整个文件最后一个数据之后;写数据时追加到了原有数据之后。C例 float f2;FILE *fp;

15、fp=fopen(“aa.dat”,“rb”);fread(f,4,2,fp);for(i=0;i2;i+)fread(&fi,4,1,fp);例 struct student int num;char name20;char sex;int age;float score3;stud10;for(i=0;i10;i+)fread(&studi,sizeof(struct student),1,fp);C例 从键盘输入4个学生数据,把他们转存到磁盘文件中去#include#define SIZE 2struct student_type char name10;int num;int age;

16、char addr15;studSIZE;main()int i;for(i=0;iSIZE;i+)scanf(%s%d%d%s,studi.name,&studi.num,&studi.age,studi.addr);save();void save()FILE*fp;int i;if(fp=fopen(stu_dat,wb)=NULL)printf(cannot open filen);return;for(i=0;iSIZE;i+)if(fwrite(&studi,sizeof(struct student_type),1,fp)!=1)printf(file write errorn)

17、;fclose(fp);C格式化I/O:fprintf与fscanf函数原型:int fprintf(FILE *fp,const char *format,argument,)int fscanf(FILE *fp,const char *format,address,)功能:按格式对文件进行I/O操作返值:成功,返回I/O的个数;出错或文件尾,返回EOF例 fprintf(fp,“%d,%6.2f”,i,t);/将i和t按%d,%6.2f格式输出到fp文件 fscanf(fp,“%d,%f”,&i,&t);/若文件中有3,4.5 ,则将3送入i,4.5送入t例 从键盘按格式输入数据存到磁盘

18、文件中去#include main()char s80,c80;int a,b;FILE*fp;if(fp=fopen(test,w)=NULL)puts(cant open file);exit();fscanf(stdin,%s%d,s,&a);/*read from keaboard*/fprintf(fp,%s%d,s,a);/*write to file*/fclose(fp);if(fp=fopen(test,r)=NULL)puts(cant open file);exit();fscanf(fp,%s%d,c,&b);/*read from file*/fprintf(stdo

19、ut,%s%d,c,b);/*print to screen*/fclose(fp);C字读写函数 putw和 getw用来对磁盘读写一个字。使用putw可以往指定文件写一个字,即一个整数;使用getw可以从文件中读出一个整数。1、putw的函数原型为:int putw(int w,FILE *fp)作用:向fp所指向的文件中写入一个字返回值:操作成功返回所输出的字,不成功则返回EOFputw(20,fp);将整数20写到fp所指向的文件中2、getw的函数原型为:int getw(FILE *fp)作用:从fp所指向的文件中读出一个字返回值:读出成功则返回所读的字,发生错误或文件结束则返回E

20、OFi=getw(fp);读取fp所指向文件中的一个整数,赋给整型变量iC10.5 文件的定位一、一、一、一、rewindrewind函数函数函数函数rewindrewind的函数原型为:的函数原型为:void void rewindrewind(FILE *fpFILE *fp)作用:作用:使位置指针重新返回文件的开头使位置指针重新返回文件的开头使位置指针重新返回文件的开头使位置指针重新返回文件的开头返回值:无返回值:无二、二、二、二、位置指针随机移动函数位置指针随机移动函数位置指针随机移动函数位置指针随机移动函数 fseekfseek所谓所谓随机读写随机读写随机读写随机读写,是指读完上一个

21、字符后,并不一定要,是指读完上一个字符后,并不一定要读写其后继的字符,而可以读写文件中任意所需的字符。读写其后继的字符,而可以读写文件中任意所需的字符。fseekfseek的函数原型为:的函数原型为:int int fseekfseek(FILE *fp,FILE *fp,long offset,int baseint base)作用:将作用:将作用:将作用:将fpfp所指向文件的位置指针,移到以所指向文件的位置指针,移到以所指向文件的位置指针,移到以所指向文件的位置指针,移到以basebase所指的位所指的位所指的位所指的位置为起始点、以置为起始点、以置为起始点、以置为起始点、以offset

22、offset为位移量的位置,同时清除为位移量的位置,同时清除为位移量的位置,同时清除为位移量的位置,同时清除文件结束标志文件结束标志文件结束标志文件结束标志返回值:定位成功则返回非返回值:定位成功则返回非0 0,否则返回,否则返回0 0Cint int fseekfseek(FILE *fp,FILE *fp,long offset,int baseint base)说明:说明:说明:说明:、起始点、起始点basebase可以是:可以是:SEEK_SET、SEEK_CUR、SEEK_END三个符号常量,其值分别为三个符号常量,其值分别为0 0、1 1、2 2;分;分别表示文件开始、文件当前位置

23、、文件末尾;别表示文件开始、文件当前位置、文件末尾;、位移量、位移量offsetoffset表示以起始点为基准,向前或向后移动的表示以起始点为基准,向前或向后移动的字节数字节数(为正表示向文件尾部的方向的移动,为负则表示向文(为正表示向文件尾部的方向的移动,为负则表示向文(为正表示向文件尾部的方向的移动,为负则表示向文(为正表示向文件尾部的方向的移动,为负则表示向文件头部的方向移动);件头部的方向移动);件头部的方向移动);件头部的方向移动);要求在数字后面加一个字母要求在数字后面加一个字母要求在数字后面加一个字母要求在数字后面加一个字母“L”“L”,表示是长整型数。,表示是长整型数。,表示是

24、长整型数。,表示是长整型数。例:例:例:例:、fseek(fp,2,SEEK_SET););将文件位置指针将文件位置指针从文件开始处从文件开始处从文件开始处从文件开始处向后移动向后移动2 2个字节个字节fseek(fp,2,0)fseek(fp,2,0)、fseek(fp,2,SEEK_CUR);将文件位置指针将文件位置指针从当前位置从当前位置从当前位置从当前位置向后移动向后移动2 2个字节个字节fseek(fp,2,1)fseek(fp,2,1)、fseek(fp,-5,SEEK_END);将文件位置指针将文件位置指针从文件末尾从文件末尾从文件末尾从文件末尾向文件头部的方向移动向文件头部的方

25、向移动5 5个字节个字节fseek(fp,-5,2)fseek(fp,-5,2)C三、三、三、三、求文件位置指针当前位置的函数求文件位置指针当前位置的函数求文件位置指针当前位置的函数求文件位置指针当前位置的函数 ftellftellftellftell的函数原型为:的函数原型为:long long ftellftell(FILE *fpFILE *fp)作用:返回作用:返回作用:返回作用:返回fpfp所指向的文件的位置指针所指向的文件的位置指针所指向的文件的位置指针所指向的文件的位置指针(相对于文件头部的(相对于文件头部的(相对于文件头部的(相对于文件头部的位移量)位移量)位移量)位移量),出

26、错则返回,出错则返回,出错则返回,出错则返回 1L1LC10.6 出错检测ferror函数函数原型:int ferror(FILE *fp)功能:测试文件是否出现错误返值:未出错,0;出错,非0说明每次调用文件输入输出函数,均产生一个新的ferror函数值,所以应及时测试fopen打开文件时,ferror函数初值自动置为0C clearerr函数函数原型:void clearerr(FILE *fp)功能:使文件错误标志置为0返值:无说明:出错后,错误标志一直保留,直到对同一文件调clearerr(fp)或rewind或任何其它一个输入输出函数C例 ferror()与clearerr()举例#include int main(void)FILE*stream;stream=fopen(DUMMY.FIL,w);getc(stream);if(ferror(stream)printf(Error reading from DUMMY.FILn);clearerr(stream);if(!ferror(stream)printf(Error indicator cleared!);fclose(stream);return 0;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁