




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章文件,9.1文件概述9.2文件的打开和关闭9.3文本文件的输入和输出9.4二进制文件的输入和输出9.5其他文件库函数定位函数出错监测函数,9.1文件概述,文件是存储在外部介质上的数据的集合,由操作系统来管理。最常用的是磁盘(硬盘、U盘、光盘等)文件。从文件数据的组织形式看文件可分为文本文件和二进制文件。源程序文件一般是文本文件。数据文件可是文本文件,也可是二进制文件。C语言把文件都看作“字节流”文件,也称“流式文件”,对文件的读写是以字节为单位的。,C语言中的文本文件的每个字节代表一个字符,存放的是该字符的ASCII码。C语言中的二进制文件是把数据按其在内存中的存储形式照原样输出到磁盘上。C语言中对文件处理的方法可分为两种:缓冲文件系统系统自动为打开的文件开辟其各自的内存缓冲区,本章介绍的文本文件和二进制文件都属此种。非缓冲文件系统系统不自动开辟内存缓冲区,而由用户根据需要在程序中设定。,9.2文件的打开和关闭,文件类型(FILE)指针fopen函数fclose函数,文件类型(FILE)指针,FILE类型处理一个文件应知它的各种信息,这些信息由系统将其构成一个结构体类型,取名FILE,谓之文件类型,其定义放在stdio.h头文件中。typedefstructshortlevel;/*fill/emptylevelofbuffer*/unsignedflags;/*Filestatusflags*/charfd;/*Filedescriptor*/unsignedcharhold;/*Ungetccharifnobuffer*/shortbsize;/*Buffersize*/unsignedchar*buffer;/*Datatransferbuffer*/unsignedchar*curp;/*Currentactivepointer*/unsignedistemp;/*Temporaryfileindicator*/shorttoken;/*Usedforvaliditychecking*/FILE;,FILE类型指针包含了stdio.h头文件就可用FILE来定义文件类型的指针变量。如:FILE*fp;可以使fp指向某一文件的结构体变量,从而可通过读取该结构体变量中的各项信息来实现对该文件的操作。一个文件指针用来操作一个文件。如有n个文件,一般应定义n个文件类型指针变量来分别指向n个文件。,fopen-文件打开函数,原型:FILE*fopen(char*filename,char*mode);调用时:filename(文件名)为要打开文件的文件名(字符串),可写成:test.dat或定义过chars=test.dat;则写s;或定义过char*pc=test.dat;则写pc;或定义过#definefftest.dat;则写ff。,mode为文件使用方式或称打开方式,可以是:r只读,为输入打开一个文本文件;w只写,为输出打开一个文本文件;a追加,向文本文件尾追加数据;rb只读,为输入打开一个二进制文件;wb只写,为输出打开一个二进制文件;ab追加,向二进制文件尾追加数据;r+读写,为读/写打开一个文本文件;w+读写,为读/写建立一个新文本文件;a+读写,为读/写(追加)打开一个文本文件;“rb+”读写,为读/写打开一个二进制文件;wb+读写,为读/写打开一个二进制文件;ab+读写,向读/写二进制文件尾追加数据;,打开文件常用如下语句:if(fp=fopen(file1.dat,r)=NULL)printf(cannotopenthisfile.n);exit();如果调用fopen()成功,返回一文件类型指针,否则返回一空指针。其中exit()是个进程控制库函数,其作用是关闭所有文件,终止程序运行。格式为:voidexit(intstatus),fclose-文件关闭函数,原型:intfclose(FILE*fp)如果文件关闭成功,返回0,如检测到任何错误,则返回EOF(即-1,在头文件stdio.h中定义)任何已经打开的文件在文件使用结束后,应用fclose函数及时关闭。程序结束时,程序中打开的所有文件会被自动关闭。,9.3文本文件的输入输出,读写一个字符的函数fgetc()和fputc()字符串读写函数-fgets()和fputs()格式化读写函数-fscanf()和fprintf(),1读写字符函数,1)读字符函数-fgetc()格式:intfgetc(FILE*fp)功能:从一打开的文件中读一个字符,返回该字符。文件中有一个指向当前位置的指针自动后移一个字符。反复调用可一直读到文件结束。文件结束或出错时,返回EOF。C语言还提供了一个检测文件结束函数:intfeof(FILE*fp)如果文件结束,返回非0值,否则返回0。,【例9.1】设计程序读一个源程序文件,并在屏幕上显示。源程序文件名为:“e:hello.c”。#includestdio.hmain()FILE*fp;charch;if(fp=fopen(“e:hello.c,r)=NULL)printf(cannotopenthisfile.n);exit();ch=fgetc(fp);while(feof(fp)=0)putchar(ch);ch=fgetc(fp);fclose(fp);,其中:ch=fgetc(fp);while(feof(fp)=0)putchar(ch);ch=fgetc(fp);也可写成:while(!feof(fp)ch=fgetc(fp);putchar(ch);或:while(ch=fgetc(fp)!=EOF)putchar(ch);,写字符函数fputc()格式:intfputc(charch,FILE*fp)功能:将字符ch写到fp指向的文件中去,成功,则返回该字符,否则返回EOF。【例9.3】将字符串“WelcomeFreshman!”写入e:下名为“file1.txt”的磁盘文件中。,#includestdio.hmain()FILE*fp;charch;if(fp=fopen(“E:file1.txt,w)=NULL)printf(cannotopenthisfile.n);exit();while(ch=getchar()!=n)fputc(ch,fp);fclose(fp);运行时输入:WelcomeFreshman,2读写字符串函数,1)读字符串函数-fgets()格式:char*fgets(char*buf,intmax,FILE*fp);功能:从fp指定的文件读取长度为max-1的字符串存入起始地址为buf的内存空间,自动加结束标志0,共占n个字符,返回值为地址buf。若在未读足max-1个字符前遇到换行符n或文件结束就停止读取。若读到文件末尾或出错,则返回NULL值,2)写字符串函数-fputs()格式:intfputs(char*buf,FILE*fp);其中buf可以是字符串常量,字符数组名或字符指针。功能:将buf指向的字符串写到fp指定的文件。但不输出字符串结束符。写成功,则返回所写的最后一个字符,否则返回EOF值。,例:(填空):从键盘上输入一个字符串,把其中的小写字母改成大写,输出到文件test.txt中,然后从该文件读出此字符串并显示。#includemain()FILE*fp;charstr100;inti=0;gets(str);if(fp=fopen(test.txt,_)=NULL)printf(Cantopenthisfile.n);exit(0);while(stri)if(stri=a,w,stri-32,r,【例9.5】将字符串Theydecidedtomeetthefollowingevening.加密后写入磁盘文件,该文件名为file3.txt。加密算法是将信息字符串每个字符和密钥字符串,唐诗“床前明月光,疑是地上霜,举头望明月”的汉语拼音码相加。解密的方法当然是二者相减。这可从磁盘文件中把密码读到内存后解密验证。,#includemain()FILE*fp;intlen,i;chars80=Theydecidedtomeetthefollowingevening.,charr80=ChuangqianmingyueguangYishidishangshuangJjutouwang,a80;len=strlen(s);for(i=0;ilen;i+)ai=si+ri;/*加密运算*/ai=0;puts(a);/*显示密码*/fp=fopen(file3.txt,w);fputs(a,fp);/*写入文件*/fclose(fp);fp=fopen(file3.txt,r);fgets(a,len+1,fp);/*读文件*/for(i=0;ilen;i+)ai=ai-ri;/*解密运算*/puts(a);/*显示原信息*/,3格式化读写函数,调用格式:fscanf(FILE*fp,格式说明,输入表列);fprintf(FILE*fp,格式说明,输出表列);这两个函数与scanf()和printf()相似,只是读写对象不同,前者是文件,后者是终端。,【例9.6】编程序构成一个九九表,写入文件file4.txt。再从该文件把九九表中的数据读入二维数组a99#includemain()FILE*fp;inti,j,a99;fp=fopen(file4.txt,w);for(i=1;i10;i+)for(j=1;j10;j+)fprintf(fp,%3d,i*j);fprintf(fp,n);fclose(fp);,fp=fopen(file4.txt,r);for(i=0;i9;i+)for(j=0;j9;j+)fscanf(fp,%d,总结1:辅助函数,FILE*fp;打开文件fp=fopen(“文件名”,“打开方式”);关闭文件fclose(fp);判断文件是否结束feof(fp);/*文件结束返回值为1,否则为0*/EOF/*文件结束标志*/,总结2:读写函数一览,charc,s80;intmax;FILE*fp,*fp1;/*从fp指向的文件读1个字符赋给字符c*/c=fgetc(fp);/*将字符c写到fp指向的文件中*/fputc(c,fp);/*从fp指向的文件读max-1个字符写到字符串s中*/fgets(s,max,fp);/*将字符串s的内容写到fp指向的文件中*/fputs(s,fp);/*从fp指向的文件中按格式读内容到变量地址表*/fscanf(fp,格式控制符,变量地址表);/*将变量表的内容按格式控制符的格式写到fp指向的文件中*/fprintf(fp,格式控制符,变量表);,charc,s80;intmax;FILE*fp;,操作对象不同的两种函数的对比,9.4二进制文件的输入输出,格式:intfread(void*buf,intsize,intn,FILE*fp);intfwrite(void*buf,intsize,intn,FILE*fp);其中:void*buf:任何类型指向数据块(首址)的指针,intsize:要读写的数据块字节数,intn:要读写的数据块个数,FILE*fp:指向已打开的要读写文件的指针。读或写成功,返回读或写数据块个数,例(填空):以下程序把从键盘读入的10个整数以二进制方式写到一个名为bin.dat的新文件中。#includeFILE*fp;main()inti,j;if(fp=fopen(_,wb)=NULL)exit(0);for(i=0;i10;i+)scanf(%d,bin.dat,sizeof(int),fp,【例9.9】设职工数据为:工号、姓名、性别、年龄、工资,将6名职工的数据从键盘输入,然后送入磁盘文件worker1.rec中保存。再读此文件并输出这些数据,依次打印出来。,说明:其实前叙四对对文件的操作函数既可以用于操作文本文件,也可用于操作二进制文件,但fgetc/fputc、fputs/fputs、fscanf/fprintf三对函数更常用于操作文本文件,而fread/fwrite函数更常用于操作二进制文件,这是一种主流用法、直观而方便。,*9.5其他文件操作函数,1)文件的定位函数每个文件打开进行读、写操作时,有一个文件指针表明当前文件的读写位置,该指针在读写过程中是自动移动的C语言库中提供了文件定位函数可对文件的指针进行人工操纵。rewind(FILE*fp);作用是使当前位置指针重新返回文件的开头,程序可对文件重新作读写操作.,fseek()函数fseek(FILE*fp,位移量,起始点);其中“起始点”指位置移动的基准点,它可以是文件的开始,也可以是文件的当前位置,也可是文件的末尾。“位移量”指以“起始点”为基准前后移动的字节数,可选:SEEK_SET或0偏移量的起始点为文件开始SEEK_CUR或1偏移量的起始点为当前位置SEEK_END或2偏移量的起始点为文件结尾,下面是fseek()调用的一些例子,fp是指向文件的指针。fseek(fp,0L,SEEK_SET);/*找到文件开始处*/fseek(fp,20L,SEEK_SET);/*找到文件的第20个字节*/fseek(fp,2L,SEEK_CUR);/*从文件的当前位置向尾部移动2个字节*/fseek(fp,0L,SEEK_END);/*找到文件的尾部*/fseek(fp,-10L,SEEK_END);/*从文件的结尾处退回10个字节*/,2)出错监测函数ftell(FILE*fp)函数该函数的作用是检测文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 儿童英文诗歌选集及朗诵示范
- 乳品评鉴师国庆节后复工安全考核试卷含答案
- 房屋租赁安全责任合同范本
- 井下作业机司机中秋节后复工安全考核试卷含答案
- 供热生产调度工中秋节后复工安全考核试卷含答案
- 新质生产力讲座:深度解读与直播
- 光伏薄膜组件制造工国庆节后复工安全考核试卷含答案
- 车用加气站操作员中秋节后复工安全考核试卷含答案
- 数控车工中秋节后复工安全考核试卷含答案
- 平板显示膜回收工节假日前安全考核试卷含答案
- (北师大版2024)七年级数学上学期期中测试卷
- 义务教育法主题班会课件
- 全国计算机等级考试一级历年考试真题试题库(含答案)
- 《系统工程与决策分析》全册配套课件
- DL∕T 2033-2019 火电厂用高压变频器功率单元试验方法
- 数据驱动的教育决策
- 租房转让协议书
- 译林版七年级上学期英语第一次月考试卷(含答案解析)
- 儿童常见呼吸道疾病雾化吸入治疗专家共识课件
- 大学生国家安全与保密培训
- 2023新能源光伏发电生产指标体系
评论
0/150
提交评论