课课通C语言(计算机类)(第2版)课件 第8章 文件_第1页
课课通C语言(计算机类)(第2版)课件 第8章 文件_第2页
课课通C语言(计算机类)(第2版)课件 第8章 文件_第3页
课课通C语言(计算机类)(第2版)课件 第8章 文件_第4页
课课通C语言(计算机类)(第2版)课件 第8章 文件_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课课通C语言(第2版)TALK第8章文件考纲要求★理解文件及文件指针的定义。★掌握文件的打开和关闭。★掌握文件的读/写操作。★掌握文件中的常用函数。考纲要求LEARNINGOBJECTIVES核心概念理解深入理解文件的逻辑结构,掌握文件指针在程序中的核心作用与定义方式。基础操作掌握熟练掌握文件的打开(fopen)与关闭(fclose)流程,理解不同打开模式的具体含义。核心读写功能精通顺序读写与随机读写的实现,重点掌握字符读写、行读写及数据块读写函数的应用。工具函数拓展掌握文件定位(rewind/fseek)、状态检测(feof/ferror)等辅助函数,构建完整的文件操作知识体系。本章目录CONTENTS018.1文件指针及文件的打开和关闭理解文件概念,掌握文件指针定义及文件的打开与关闭。028.2文件的读/写操作掌握字符、字符串、数据块和格式化四种读写方式。038.3文件中的常用函数掌握文件定位函数和检测函数的使用方法与场景。048.4文件的应用综合运用文件知识解决实际开发中的数据存储与读取问题。8.1文件指针及

文件的打开和关闭CHAPTER08/SECTION018.1文件指针及文件的打开和关闭1.理解文件的概念。2.掌握文件指针的定义。8.1.1文件的概念ASCII文件(文本文件)TextFile/CharacterEncodedFormat💾存储原理以字符为基本单位,每个字符均对应一个唯一的ASCII码值进行存储。✨核心特点内容直观,可在终端直接阅读;跨平台移植性好。缺点是I/O读写效率相对较低。📊存储示例(整数5)存储为ASCII码:00110101(仅占用1字节空间)二进制文件(BinaryFile)DirectMemoryDump/RawData💻存储原理完全按照数据在内存中的二进制原始形式进行存储,不进行任何编码转换。⚡核心特点I/O读写效率极高,节省存储空间。缺点是不可直接阅读,且受平台/编译器影响,移植性稍差。📊存储示例(整数5)存储为二进制:0000000000000101(占用2字节,int类型示例)8.1.2文件指针的定义▍核心定义与格式文件指针是一个指向`FILE`结构体的指针变量,它是程序与外部文件建立关联的唯一桥梁。FILE*文件指针变量名;//定义格式FILE*fp;//示例定义`FILE`结构体类型由C标准库stdio.h提供,封装了文件的状态、缓冲区位置等核心信息。`fp`文件指针变量程序通过该指针间接操作底层文件,所有的文件I/O函数都需要它作为参数。▍标准文件操作流程01.打开文件(Open)调用fopen()函数,建立程序与文件的连接,获取文件指针。02.读写文件(RW)使用fread()/fwrite()或fgetc()/fputc()进行数据交互。03.关闭文件(Close)调用fclose()函数,释放文件资源,防止内存泄漏。8.1.3文件的打开与关闭打开文件:fopen()fp=fopen("文件名","打开方式");示例:fp=fopen("data.txt","r");//以只读方式打开文本文件常用文件打开方式:"r":只读(文件必须存在)"r+":读写(文件必须存在)"w":只写(不存在则创建)"a":追加(在末尾写入)关闭文件:fclose()intfclose(FILE*fp);💡核心作用断开文件指针与磁盘文件的联系,释放系统分配的文件资源。操作完成后必须关闭,这是良好的编程习惯。8.2文件的读/写操作FILEINPUT&OUTPUT8.2文件的读/写操作1.掌握文件读/写操作的过程。2.掌握文件读/写操作的4种方式。8.2.2文件读/写操作的4种方式01/字符读写读READ:fgetc(fp)—从文件中读取单个字符写WRITE:fputc(ch,fp)—写入单个字符到文件02/字符串读写读READ:fgets(str,n,fp)—读取n-1个字符写WRITE:fputs(str,fp)—将字符串写入文件03/数据块读写读READ:fread(...)—读取指定大小的二进制块写WRITE:fwrite(...)—写入指定大小的二进制块04/格式化读写读READ:fscanf(fp,fmt,&v)—按格式读取数据写WRITE:fprintf(fp,fmt,v)—按格式写入数据例题解析【例8-2-2】:杨辉三角的文件读写▍核心解题思路01.数据生成利用二维数组特性,通过递推公式构建杨辉三角矩阵。02.二进制写入使用fwrite()函数,按行将二维数组数据写入文件yh.dat。03.二进制读取使用fread()函数,按相同的格式从文件中读取数据到新数组。04.结果验证与输出遍历读取后的数组,打印数据以验证读写的准确性。▍关键代码实现//1.打开文件并写入数据FILE*fp=fopen("yh.dat","wb");for(i=0;i<N;i++)fwrite(yha[i],sizeof(int)*N,1,fp);fclose(fp);//2.重新打开文件并读取fp=fopen("yh.dat","rb");for(i=0;i<N;i++){fread(yhb[i],sizeof(int)*N,1,fp);...}fclose(fp);💡提示:二进制读写需严格匹配数据块的大小与类型。8.3COMMONFUNCTIONSINFILES文件中的常用函数8.3文件中的常用函数1.掌握文件的定位函数。2.掌握文件的检测函数。8.3.1文件的定位函数rewind(fp)核心功能将文件内部的位置指针无条件地移动到文件开头。常用于需要重新读取文件内容的场景。操作简单,无返回值fseek(fp,offset,origin)功能:将位置指针移动到由offset和origin共同决定的指定位置,实现随机读写。参数说明:•offset:位移量(long型,正数向后移,负数向前移)•origin:起始点(0:开头/1:当前/2:末尾)应用示例://将指针从文件末尾向前移动10个字节(定位到倒数第10个位置)fseek(fp,-10L,SEEK_END);8.3.2文件的检测函数feof(fp)·文件尾检测功能描述判断文件内部指针是否已移动到文件的末尾位置。返回值规则已到末尾→返回非0值;未到末尾→返回0。核心用途作为循环读取文件的终止条件,控制读取逻辑的结束。while(!feof(fp)){...//读取文件内容}ferror(fp)·错误检测功能描述检查文件在进行读写、定位等操作过程中,是否发生了错误。返回值规则操作出错→返回非0值;操作正常→返回0。使用建议每次进行关键文件操作后建议调用,及时发现I/O异常,保证程序健壮性。8.4文件的应用APPLICATIONOFFILES8.4文件的应用1.进一步掌握文件的基本概念和基本操作。2.能运用文件知识解决一些实际问题。8.4.1文件中的几个重要概念01/文件(File)核心定义:外存储器上相关数据的有序集合,名称为文件名。文件格式:盘符:\路径\文件名.扩展名(包含路径与后缀信息)。02/文件指针(Pointer)核心作用:程序与外部文件建立关联的唯一桥梁,用于操作文件。定义语法:FILE*fp;(fp为指向FILE结构体的指针变量名)。03/位置指针(Position)基本概念:指向文件当前正在进行“读”或“写”操作的具体字节位置。初始状态:当文件被成功打开时,位置指针通常默认指向文件开头。04/顺序与随机读写顺序读写:从文件头开始,按照数据存储顺序依次向后读写。随机读写:通过控制位置指针移动,实现文件任意位置的直接读写。8.4.2文件的操作步骤▍核心定义与格式文件操作遵循一个标准流程,确保资源的正确使用和释放。通过标准库函数建立连接、交互数据并释放资源。📂打开文件(Open)fp=fopen("文件名","打开方式");建立程序与文件的连接,成功返回文件指针,失败返回NULL。✏️读写数据(RW)利用文件指针进行交互:使用fread()/fwrite()处理块数据,或fgetc()/fputc()处理字符流。🔒关闭文件(Close)fclose(文件指针);释放文件资源,刷新缓冲区,防止内存泄漏,是操作的最后一步。▍标准代码执行流程STEP01.打开并校验FILE*fp=fopen("data.txt","r");必须判断:if(fp==NULL){exit(1);}STEP02.业务逻辑读写charbuf[100];fread(buf,1,100,fp);根据需求选择合适的IO函数处理数据。STEP03.释放资源if(fp!=NULL)fclose(fp);操作完成后务必关闭,养成良好编程习惯。8.4.3文件中的函数:读写函数(一)字符读写函数CharacterI/OFunctions📖fgetc(fp)-字符读取从文件指针fp指向的文件中读取一个字符,并返回其ASCII值。若读到文件末尾或出错,则返回EOF。✍️fputc(ch,fp)-字符写入将字符ch写入到文件指针fp指向的文件中。写入成功返回该字符的ASCII值,失败则返回EOF。字符串读写函数StringI/OFunctions📜fgets(str,n,fp)-字符串读取从文件fp中读取字符串到str,最多读取n-1个字符,遇到换行符或文件结束时停止,并自动添加结束符'\0'。📝fputs(str,fp)-字符串写入将字符串str写入到文件fp中(不包含结束符'\0')。写入成功返回一个非负值,失败则返回EOF。8.4.3文件中的函数:读写函数(二)数据块读写函数BlockRead/WriteFunctions(BinaryI/O)📖fread(buffer,size,count,fp)从文件流fp中读取count个大小为size的数据块,存入buffer指向的内存。返回实际成功读取的数据块个数。✍️fwrite(buffer,size,count,fp)将buffer指向的内存中count个大小为size的数据块写入文件流fp。返回实际成功写入的数据块个数。⚡核心优势直接操作二进制数据,I/O效率极高,适合读写数组、结构体等复杂数据。格式化读写函数FormattedRead/WriteFunctions(TextI/O)📖fscanf(fp,format,...)从文件流fp中按照指定的format(格式控制符)读取数据,并赋值给后续的变量参数。✍️fprintf(fp,format,...)将变量参数按照指定的format(格式控制符)进行格式化,然后输出写入到文件流fp中。✨核心优势数据可读性强,可直接用文本编辑器查看,适合处理具有固定格式的文本数据。8.4.3文件中的函数:定位函数rewind(fp)核心功能将文件内部的位置指针无条件地移动到文件开头。常用于需要重新读取文件内容的场景。操作简单,执行后无返回值fseek(fp,offset,origin)功能:将位置指针移动到由offset和origin共同决定的指定位置,实现文件的随机读写。参数详解:•offset:位移量(long型,正数向后移动,负数向前移动)•origin:起始点(0=SEEK_SET/开头,1=SEEK_CUR/当前,2=SEEK_END/末尾)代码应用示例://场景:将指针从文件末尾向前移动10个字节,定位到倒数第10个位置fseek(fp,-10L,SEEK_END);8.4.3文件中的函数:检测函数feof(fp)·文件尾检测功能描述判断文件内部指针是否已移动到文件的末尾位置。返回值规则已到末尾→返回非0值;未到末尾→返回0。核心用途作为循环读取文件的终止条件,控制读取逻辑的结束。while(!feof(fp)){...//读取文件内容}ferror(fp)·错误检测功能描述检查文件在进行读写、定位等操作过程中,是否发生了错误。返回值规则操作出错→返回非0值;操作正常→返回0。使用建议每次进行关键文件操作后建议调用,及时发现I/O异常,保证程序健壮性。例题解析【例8-4-1】:商品信息排序核心解题思路01.封装读取函数定义`readfile`函数,专门负责从`goods.txt`中读取数据并存到二维数组中。02.程序入口调用在`main`函数中调用该函数,获取完整的商品ID与好评数数据。03.插入法排序以好评数字段为关键字,使用插入排序算法对内存中的数组进行排序。04.格式化输出结果:遍历数组,按要求打印排名前10的商品名。题目描述数据文件“goods.txt”中存储了商品信息记录表,每个商品信息由商品编号和好评数两部分组成。程序功能要求:1.根据“好评数”字段,对商品信息进行从高到低的排序。2.输出规则:-若商品总数>10:输出排名前10条记录的商品编号。-若商品总数≤10:按序输出全部记录的商品编号。数据格式示例:|10010|51|(编号:10010,好评数:51)|11213|7|(编号:11213,好评数:7)例题解析【例8-4-1】:核心代码实现▍核心解题思路01.文件数据读取调用自定义函数,使用fopen打开、fscanf循环读取数据存入二维数组,最后fclose关闭文件。02.核心插入排序遍历数组,将第i+1个元素作为待插入元素,向前扫描已排序序列,找到合适位置后进行移动与插入。03.限制条数输出利用三元运算符控制循环次数,确保无论数据多少,最多只格式化输出前10条有效数据。▍关键代码填空实现intfile_n=readfile(goods);//获取数据条数//---插入排序核心循环---for(i=0;i<file_n-1;i++){p=①???;//初始化待比较位置t0=goods[i+1][0];t1=goods[i+1][1];while((t1>②???)&&p>=0){goods[p+1][1]=goods[p][1];goods[p+1][0]=goods[p][0];p--;//向前查找}goods[p+1][0]=t0;goods[p+1][1]=t1;//插入}//---条件输出---for(i=0;i<(file_n<10?③???:10);i++)printf("%6d%6d%6d\n",i+1,goods[i][0],goods[i][1]);💡思考提示:填空①通常是i(指向有序区末尾);填空②是goods[p][1](比较关键字);填空③是file_n(实际数据量)。例题解析【例8-4-1】:答案与解析填空答案详解①空:i插入排序中,p初始化为当前已排序序列的最后一个元素的下标i。②空:goods[p][1]比较待插入元素的好评数t1与已排序序列中元素goods[p][1]的大小。③空:file_n/④空:fopen("goods.txt","r")③三元运算符,若file_n<10输出file_n个,否则输出10个。

④readfile函数中,以只读方式打开文件goods.txt。⚠️易错点深度分析A处循环条件错误(数组越界)原题:for(i=0;i<file_n;i++)

错误原因:i+1会导致访问数组时越界。

正确写法:for(i=0;i<file_n-1;i++)文件读取逻辑不完整readfile函数中缺少核心读取语句:

fscanf(fp,"%d%d",&id,&g);

缺少此句将导致读取的数据为随机值。例题解析【例8-4-2】:学生信息排序核心解题思路01.数据读取使用`fscanf`从文件`stu.txt`中读取姓名、性别、身高数据,并分别存储到三个对应数组中。02.规则排序(变形选择法)外循环控制比较轮数,内循环在当前范围内找出“同性别的最矮同学”,作为本轮的目标最值。03.按性别交换位置将找到的最值元素与本轮首位(女生)或末位(男生)元素交换,实现“女前男后、女升男降”。04.格式化输出:遍历排序后的数组,按指定格式输出最终结果。题目描述与测试数据功能:读取文件“stu.txt”中的学生信息(姓名、性别、身高),按规则排序并输出。

排序规则:女生(0)在前,男生(1)在后;女生按身高升序,男生按身高降序。原数据(stu.txt):叶佳文(0)-170cm|孔维佳(0)-165cm|谢定军(1)-179cm马小意(1)-165cm|李许彤(0)-160cm💡预期结果:李许彤(160)→孔维佳(165)→叶佳文(170)→谢定军(179)→马小意(165)例题解析【例8-4-2】:核心代码实现▍核心解题思路01.读取数据使用fscanf函数,注意参数需严格匹配变量的地址。02.排序逻辑以while(front<last)为外循环,动态控制排序范围。03.查找最值利用for内循环遍历当前范围,精准定位同性别的身高最小值。04.交换与调整按性别规则交换元素位置,并实时调整front或last指针。▍关键代码实现//1.从文件中批量读取数据for(i=0;i<N_MAX;i++){fscanf(infile,"%s%d%d",/*①填空:变量地址*/);}//2.核心排序逻辑(while+for)while(/*②填空:front<last*/){for(...)if(/*③填空:性别条件*/&&high[p]>high[i])p=i;else{sw_data(...);/*④填空:last--*/;}💡提示:四个填空处分别对应了“读、判、找、调”四个核心动作,是理解本算法的关键所在。例题解析【例8-4-2】:答案与解析填空答案详解Answers&Explanations①输入参数:name[i],&sex[i],&high[i]fscanf需要传入变量的地址来存储从文件读取的值。②循环条件:front<last外循环持续条件,当front指针超过last指针时,区间处理完毕。③性别筛选:sex[p]==sex[i]核心判断条件,确保在内循环中只比较同性别的学生,寻找最值。④范围缩小:last--处理完男生后,将last指针前移,缩小待排序区间。核心算法思路AlgorithmLogic&Analysis💡双指针区间划分法该算法巧妙利用front(头指针)和last(尾指针)动态划分待排序区间。

每一轮在区间内找到符合条件的元素(女生最矮/男生最高),并将其交换至区间的头部或尾部。

随后通过移动指针(front++或last--)缩小区间范围,直至front>=last时结束。

该方法仅需一次遍历即可完成排序,时间复杂度为O(n),逻辑清晰且效率较高。总结:通过双指针技术减少了不必要的元素比较,实现了高效的原地排序。例题解析【例8-4-3】:行程轨迹判断核心解题思路01.数据准备从文件`CITIES.txt`中读取13个城市名称,并将其存入数组备用。02.输入行程循环读取用户输入的行程轨迹城市名,直至用户输入空行结束输入。03.查找判断对输入行程中的每个城市名,调用`find`查找函数进行逐一检索。04.结果输出:根据是否找到所有城市设置`outflag`,并输出最终判断结果。题目描述文件“CITIES.txt”中以字符串形式升序存放了某地区13个城市的名称。本程序的核心功能是:输入某人行程轨迹中的各城市名,通过程序逻辑判断其是否离开过该指定地区。核心考点:文件的顺序读取操作、字符串的查找算法实现、以及逻辑标志位(Flag)的使用。例题解析【例8-4-3】:核心代码实现▍核心解题思路01.文件操作打开文件读取城市名后,必须执行关闭文件操作,防止资源泄漏。02.折半查找算法利用find函数实现高效查找,前提是数据已排序,时间复杂度O(logn)。03.核心逻辑判断在主函数中,根据find的返回值动态设置outflag,控制程序流程。▍关键代码实现//主函数:文件读取与逻辑判断for(i=0;i<CITIES_NUM;i++)fscanf(fp,"%s",city[i]);fclose(fp);//①必须关闭文件if(!find(path[i],city,n))outflag=1;//②置标志位//子函数:折半查找核心逻辑mid=(top+below)/2;//③更新中间索引return(top<=below)?1:0;//④返回查找结果💡提示:折半查找要求数据有序,且需正确维护top/below/mid三个指针的关系。例题解析【例8-4-3】:答案与解析填空答案解析①fclose(CITIES_file)文件操作完毕后必须关闭,释放系统资源,防止内存泄漏。②outflag=0若find函数返回0(未找到目标城市),则将标志位清零,表示离开过该地区。③mid=(top+below)/2折半查找核心步骤,每次迭代都需要重新计算中间位置索引mid。④top<=below循环结束后若成立则找到目标,否则未找到。核心算法:折半查找🔍算法执行逻辑要求数组有序。每次比较中间元素,若目标值小于中间值,则在左半区继续查找;若大于,则在右半区查找。不断缩小范围,直到找到目标或确定不存在。📈性能优势与关键点时间复杂度为O(logn),效率远高于顺序查找。本题中通过`top`和`below`指针动态维护查找区间是算法的关键。巩固练习:程序阅读题01/题目一:二进制文件读写与指针定位intarr[]={1,3,5,7,9};fp=fopen("file8.dat","wb");for(i=0;i<5;i++)fwrite(&arr[i],sizeof(int),1,fp);fseek(fp,-3L*sizeof(int),SEEK_END);fread(&n,sizeof(int),1,fp);printf("n=%d\n",n);💡核心考点fseek从文件末尾向前偏移3个int长度,读取到数组的第3个元素。最终输出:n=502/题目二:文本文件写入模式与内容覆盖voidWriteStr(charstr[]){FILE*ff=fopen("t1.txt","w");

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论