




已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
存储设备,第九章数据的永久性存储,内部存储设备,外部部存储设备,9.1数据的永久性存储,文件是永久性存储设备的最基本存储单位。文件能够大量的、永久性的保存数据信息,并能够通过各种文件操作功能来管理和使用这些数据。,文件概念:文件是指存储在永久性存储设备上的具有名字(文件名)的一组相关数据的集合,通常也被称为磁盘文件。,9.2文件的组织方式,根据编码方式,文件可以分为两种:一种是文本文件(ASCII码文件),另一种是二进制文件。,通过C语言编程实现对文件的访问时,必须要严格按照文件原有的编码方式及文件存储格式来对文件进行访问操作,才能正确读写文件数据。,9.3文件的操作,文件操作主要包括读文件和写文件等。读文件是指从文件中把数据信息读入内存中,以供程序调用;写文件是指把内存中的数据信息输出到永久性存储设备上的文件中,起到保存数据和实现数据共享的功能。,9.3文件的操作,头文件stdio.h定义了文件结构体类型FILE,用来保存文件的文件名、文件的状态和文件当前的读写位置等相关文件信息。,9.3.1stdio.h,typedefstructshortlevel;/*缓冲区满或空的程度*/unsignedflags;/*文件状态标志*/charfd;/*文件描述符*/unsignedcharhold;/*如无缓冲区不读字符*/shortbsize;/*缓冲区的大小*/unsignedchar*buffer;/*数据缓冲区的位置*/unsignedchar*curp;/*文件内位置指针当前的指向*/unsignedistemp;/*临时文件指示器*/shorttoken;/*用于有效性检查*/FILE;,9.3文件的操作,C语言的文件操作编程时,用FILE来定义一个文件结构体类型指针变量(通常称为文件指针),用来指向被访问的文件并通过该文件指针变量来访问文件信息。文件指针定义形式:,9.3.1stdio.h,FILE*fp;/*定义文件结构体类型指针变量*/,上面的C程序语句定义了一个文件指针fp,但fp指向哪个文件,目前并不知道,只有通过文件打开函数让fp指向某个指定文件,将fp与该文件关联起来,才能使用fp。,9.3文件的操作,C语言是以文件流的形式来对文件进行访问操作的。为了便于对文件流的顺序访问和随机定位访问,在文件内部还有一个位置指针来指向文件的当前读写操作位置,这就是文件结构体FILE中的成员指针变量curp。,9.3.1stdio.h,9.3文件的操作,stdio.h中关于文件的宏定义,9.3.1stdio.h,#defineSEEK_SET0/*表征文件头位置*/#defineSEEK_CUR1/*表征文件位置指针当前所处位置*/#defineSEEK_END2/*表征文件尾位置*/#defineEOF-1/*文件结束标识宏常量*/,9.3文件的操作,stdio.h中关于文件的常用函数,9.3.1stdio.h,9.3文件的操作,9.3.2文件的打开与关闭,(1)文件打开函数fopen(),原型:FILE*fopen(constchar*filename,constchar*mode);头文件:#include功能:以指定方式打开所指定的文件参数:filename文件路径加文件名,mode文件打开方式返回值:若打开文件成功,则返回文件指针值;否则,返回NULL,(2)文件关闭函数fclose(),原型:intfclose(FILE*stream);头文件:#include功能:关闭文件参数:stream文件指针返回值:若关闭文件成功,则返回0;否则,返回EOF,9.3文件的操作,9.3.2文件的打开与关闭,FILE*fp,*fpBinary;fp=fopen(“c:zwgzwg.txt,r);/*以只读方式打开文本文件*/if(NULL=fp)printf(Opentextfilezwg.txterror!);exit(-1);fpBinary=fopen(“c:zwgzwg.bin,rb+);/*以读/写方式打开二进制文件*/if(NULL=fpBinary)printf(Openbinaryfilezwg.binerror!);exit(-1);/*此处可放置若干文件操作代码*/fclose(fp);/*关闭文件指针fp所指向的文件*/fclose(fpBinary);/*关闭文件指针fpBinary所指向的文件*/,9.3文件的操作,9.3.2文件的打开与关闭,关于文件的打开方式,9.3文件的操作,9.3.3文件读/写函数及与读写相关的函数,文件结束标识测试函数feof()文件操作错误测试函数ferror()字符读/写函数fgetc()和fputc()字符串读/写函数fgets()和fputs()格式化读/写函数fscanf()和fprintf()数据块读/写函数fread()和fwrite(),9.3文件的操作,9.3.3文件读/写函数及与读写相关的函数,文件结束标识测试函数feof(),原型:intfeof(FILE*stream);头文件:#include功能:文件结束标识符测试参数:stream文件指针返回值:若文件内部读写位置指针正指向文件尾,则返回非0值;否则,返回0值,if(!feof(fp)/*如果没有遇到文件尾则执行操作*/*文件读写操作代码*/,9.3文件的操作,9.3.3文件读/写函数及与读写相关的函数,文件操作错误测试函数ferror(),原型:intferror(FILE*stream);头文件:#include功能:文件操作错误测试参数:stream文件指针返回值:若出现错误,则返回非0值;否则,返回0值,if(ferror(fp)/*如果文件读或写出错*/*文件读写错误处理程序代码*/,9.3文件的操作,9.3.3文件读/写函数及与读写相关的函数,字符读/写函数fgetc()和fputc(),原型:intfgetc(FILE*stream);头文件:#include功能:从文件中读入一个字符参数:stream文件指针返回值:成功执行则返回所读取字符(字节)的整数值;否则,返回EOF,原型:intfputc(intch,FILE*stream);头文件:#include功能:把字符ch写入到文件中参数:ch字符,stream文件指针返回值:成功执行则返回所写入字符的整数值;否则,返回EOF,ch=fgetc(fp);/*从fp所指向的文件流读取一个字符,并赋给字符变量ch*/,fputc(ch,fp);/*把字符ch写入到文件中*/,9.3文件的操作,9.3.3文件读/写函数及与读写相关的函数,字符串读/写函数fgets()和fputs(),原型:char*fgets(char*s,intn,FILE*stream);头文件:#include功能:从文件中读入一个长度为n-1的字符串参数:s字符串,n要读入的字符串总长度(空字符计算在内),stream文件指针返回值:返回字符指针s的值,原型:intfputs(char*s,FILE*stream);头文件:#include功能:把字符串s写入到文件中参数:s字符串,stream文件指针返回值:成功执行则返回一个非负整数值;否则,返回EOF,9.3文件的操作,9.3.3文件读/写函数及与读写相关的函数,格式化读/写函数fscanf()和fprintf(),原型:intfscanf(FILE*stream,constchar*format,);头文件:#include功能:文件格式化读取参数:stream文件指针,format格式控制字符串,可变数目变量列表返回值:成功执行则返回所读取的字节数;否则,返回EOF,原型:intfprintf(FILE*stream,constchar*format,);头文件:#include功能:文件格式化输出参数:stream文件指针,format格式控制字符串,可变数目变量列表返回值:成功执行则返回所写入的字节数;否则,返回一负数值,9.3文件的操作,9.3.3文件读/写函数及与读写相关的函数,数据块读/写函数fread()和fwrite(),原型:size_tfread(void*buffer,size_tsize,size_tcount,FILE*stream);头文件:#include功能:读取文件数据块参数:buffer数据存储区指针,size数据项字节数,count数据项数,stream文件指针返回值:返回实际读取的数据项数,原型:size_tfwrite(void*buffer,size_tsize,size_tcount,FILE*stream);头文件:#include功能:写数据块到文件中参数:buffer数据存储区指针,size数据项字节数,count数据项数,stream文件指针返回值:成功执行,则返回值等于count;若返回值小于count,则说明写数据库出错,9.3文件的操作,9.3.3文件读/写函数及与读写相关的函数,#include#includevoidmain(void)FILE*fp,*fpNew;intnCh,nResult;fp=fopen(hit.txt,r);/*以只读方式打开文件hit.txt*/if(NULL=fp)printf(Openfilehit.txterrorn);exit(-1);fpNew=fopen(hit_new.txt,w);/*创建hit_new.txt并以只写方式打开*/if(NULL=fpNew)printf(Createfilehit_new.txterrorn);exit(-1);while(!feof(fp)/*未遇到文件尾时循环读写操作*/nCh=fgetc(fp);/*从文件hit.txt读取字符*/if(EOF!=nCh)nResult=fputc(nCh,fpNew);/*把字符写到文件hit_new.txt中*/if(EOF=nResult)printf(Writecharactertohit_new.txterrorn);exit(-1);putchar(nCh);fclose(fp);fclose(fpNew);printf(nFilesaveassuccessfully!n);,9.3文件的操作,9.3.3文件读/写函数及与读写相关的函数,#include#include#includevoidmain(void)FILE*fp;charstr81,strNew81,*pCh;intnResult,nLen;fp=fopen(hit.txt,w+);/*创建文件hit.txt并打开*/if(NULL=fp)printf(Openfilehit.txterrorn);exit(-1);gets(str);/*获取键盘输入字符串*/nLen=strlen(str);/*计算字符串长度*/nResult=fputs(str,fp);/*把字符串写入文件中*/if(EOF=nResult)printf(Writestringtohit.txterrorn);exit(-1);printf(Writestringtofilecompletelyn);fclose(fp);fp=fopen(hit.txt,r);/*以只读方式重新打开hit.txt*/if(NULL=fp)printf(Openfilehit.txterrorn);exit(-1);pCh=fgets(strNew,nLen+1,fp);/*从文件中读取字符串*/if(NULL=pCh)printf(Readstringfromhit.txterrorn);exit(-1);puts(pCh);/*输出字符串到屏幕,此处也可把pCh替换成strNew*/fclose(fp);,9.3文件的操作,9.3.3文件读/写函数及与读写相关的函数,#include#include#includevoidmain(void)FILE*fp;intnNum,nResult;floatfData;charch,str30;printf(Pleaseinputaninteger,afloat,acharandastringlikethis:n);printf(2008,8.08,B,Olympicnn);scanf(%d,%f,%c,%s,9.3文件的操作,9.3.3文件读/写函数及与读写相关的函数,#includevoidmain(void)FILE*stream;charlist80;inti,NumRead,NumWritten;if(stream=fopen(hit.txt,r)!=NULL)/*打开文件*/NumRead=fread(list,sizeof(char),60,stream);/*从文件中读取60个字符*/printf(Numberofitemsread=%dn,NumRead);/*输出所读取的字符数*/printf(Contentsofbuffer=%.60sn,list);/*输出所读取的字符块*/fclose(stream);elseprintf(Filecouldnotbeopenedn);if(stream=fopen(hit.bin,wb)!=NULL)/*创建新的二进制文件*/for(i=0;i60;i+)listi=(char)(listi+i);/*通过字符运算进行简单加密*/NumWritten=fwrite(list,sizeof(char),60,stream);/*把加密后的字符块写入文件中*/printf(Wrote%ditemsn,NumWritten);/*输出已写入文件的字符数*/fclose(stream);elseprintf(Filecouldnotbeopenedn);,9.3文件的操作,9.3.4文件定位函数,函数rewind()函数fseek()函数ftell(),9.3文件的操作,9.3.4文件定位函数,函数rewind(),原型:voidrewind(FILE*stream);头文件:#include功能:把文件内部读写位置指针无条件的重新指向文件头位置参数:stream文件指针返回值:无返回值,9.3文件的操作,9.3.4文件定位函数,函数fseek(),原型:intfseek(FILE*stream,longintoffset,intwhence);头文件:#include功能:文件内部读写位置指针置为指向一个特定的位置,该位置由函数的调用参数来决定参数:stream文件指针,offset偏移量,whence文件内部预定义位置返回值:成功执行则返回0;否则返回非0值,9.3文件的操作,9.3.4文件定位函数,函数ftell(),原型:longintftell(FILE*stream);头文件:#include功能:返回文件内部读写位置指针当前指向位置参数:stream文件指针返回值:成功执行则返回当前位置距离文件头的偏移量(字节数);否则返回-1L,9.3文件的操作,9.3.4文件定位函数,#includevoidmain(void)FILE*stream;longintlnFileSize;if(stream=fopen(hit.bin,rb)!=NULL)fseek(stream,0L,SEEK_END);/*文件内部读写位置指针指向文件尾*/lnFileSize=ftell(stream);/*求文件尾到文件头的偏移量即文件大小*/printf(Thefilesizeofhit.binis%ldbytesn,lnFileSize);fclose(stream);elseprintf(Filecouldnotbeopenedn);,9.4综合应用实例,/*定义学生信息结构体类型*/typedefstructstudentintid;/*学号*/floatcLanguage,math,english;/*C语言、数学和英语成绩*/charname20;/*学生姓名*/STUDENT;/*学生信息结构体数据类型别名*/,原型:intReadStuInfo(char*filename,char*mode,STUDENT*stu,intnum);功能:从文件中读取学生成绩信息参数:filename文件名,mode文件打开方式,stu学生结构体数组,num记录数返回值:执行成功则返回实际读入的记录数,否则返回-1,原型:intWriteStuInfo(char*filename,char*mode,STUDENT*stu,intnum);功能:把学生成绩信息写入到文件中参数:filename文件名,mode文件打开方式,stu学生结构体数组,num记录数返回值:执行成功则返回实际写入的记录数,否则返回-1,(1)读取学生信息的子函数ReadStuInfo(),(2)把中间操作结果写入到文件中的子函数WriteStuInfo(),intReadStuInfo(char*filename,char*mode,STUD
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 平安银行天津市北辰区2025秋招笔试行测高频题及答案
- 兴业银行上海市徐汇区2025秋招笔试综合模拟题库及答案
- 民生银行宁波市奉化区2025秋招笔试热点题型专练及答案
- 全国统考教师资格考试《教育教学知识与能力(小学)》题库试题附答案详解(达标题)
- 华夏银行上海市普陀区2025秋招笔试专业知识题专练及答案
- 农发行榆林市神木市2025秋招笔试英文行测高频题含答案
- 兴业银行威海市环翠区2025秋招笔试EPI能力测试题专练及答案
- 2024-2025学年执法资格考前冲刺练习题及完整答案详解【有一套】
- 农发行通辽市开鲁县2025秋招小语种岗笔试题及答案
- 家居收纳考试题及答案解析
- (高清版)DB13∕T 5817-2023 河流(湖泊)健康评价技术规范
- 装饰装修工程施工方案
- 达人合作协议书范本
- 《乳腺癌的护理查房》课件
- 学校教职工网络安全培训
- 伊利企业文化手册
- 资产评估风险管理制度
- 电力工程项目管理的职责分工
- 餐饮库房管理流程
- 市政工程监理大纲投标方案(技术方案)
- 技术经纪人(初级)考试试题(附答案)
评论
0/150
提交评论