版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第12章
文件让数据跨越程序的时空主
讲
:蒋亚平目录CONTENTS01C语言中的文件操作02文件的打开与关闭03顺序读写文件04随机读写文件05文件操作综合编程案例06本章小结问题导入如何保存永久数据?用数组/结构体存储的学生信息,一旦关闭程序就会消失。如何让程序退出后,学生信息能保存在电脑的“students.dat”文件中?下次打开程序时又怎么读取文件里的信息?“文本方式”和“二进制方式”哪种更节省空间?用“文本方式”和“二进制方式”存储学生信息,哪种更节省空间?如果要快速修改文件中第2名学生的成绩,哪种方式不需要“从头读到尾”就能直接定位?01C语言中的文件操作C语言中的文件操作为什么需要文件?结构体数组数据在内存中,一旦关闭程序,数据就会彻底消失。问题文件可以永久将数据存储在电脑磁盘中,灵活读写。方案入门程序#include<stdio.h>intmain(){FILE*file;chardata[]="Hello,CLanguageFileOperations!";//打开文件以写入数据file=fopen("example.txt","w");if(file!=NULL){fprintf(file,"%s",data);//写入文本数据fclose(file);//关闭文件}else{printf("文件无法打开!\n");}return0;}示例:文件操作入门示例。写入模式打开文件成功,则写入数据并关闭文件失败提示文件无法打开文件概念1、程序设计中主要的类型文件源代码文件(通常以.c为后缀)、目标文件(以.obj为后缀)、可执行文件(以.exe为后缀)。数据文件(.txt、.dat)等。2、程序设计中输入输出(I/O)操作输入操作:数据从文件或外部设备流向计算机的内存。输出操作:数据从计算机内存流向文件或外部设备。3、文件标识的组成文件路径:表示文件在外部存储设备中的具体位置。文件名主干:即文件的基本名称,不包含后缀部分。文件后缀:表示文件的类型或格式,通常由点号(.)分隔。例如,路径D:\workspace\c\file1.dat文件分类1、根据存储编码方式的不同文本文件(又称为ASCII文件):以字符的ASCII码值进行存储与编码,文件的内容就是一系列字符。每个字符通过其对应的ASCII码表示,因此文本文件中的数据是以人类可读的方式存储的。二进制文件:存储的是原始的二进制数据,通常用于存储非字符数据或结构化的数据。2、根据存储形式的不同字符流:用于文本文件(或称为字符文件),文件的内容主要是字符数据。二进制流:用于二进制文件,数据以二进制格式存储。文件缓冲区缓冲文件系统的工作原理磁盘C程序内存缓冲区AI辅助(文件关闭):“打开文件后一定要关闭”。写写读读文件结构typedefstruct{ shortlevel; //缓冲区使用量 unsignedflags; //文件状态标志 charfd; //文件描述符 shortbsize; //缓冲区大小 unsignedchar*buffer; //文件缓冲区的首地址 unsignedchar*curp; //指向文件缓冲区的工作指针 unsignedcharhold; //其他信息,如缓冲区无内容不读取字符 unsignedistemp; //临时文件指示器 shorttoken; //用于有效性检查};FILE文件类型的说明typedef的一般形式typedef<已有类型名><新类型名>;示例1typedefintINTEGER;INTEGERi,j;inti,j;等价于示例2typedefint*POINTER;POINTER可以代替int*,用于定义指向int类型的指针。文件类型指针文件类型指针定义文件类型指针的格式:FILE*fp;指向FILE类型的指针变量文件类型定义符指向文件信息区的指针变量AI辅助(检查指针):检查指针是否有效,避免无效操作;
02文件的打开与关闭文件的打开与关闭使用fopen打开文件文件打开的调用形式:fopen("文件名","文件打开方式");函数原型FILE*fopen(constchar*path,constchar*mode);功能打开文件参数
path路径名或文件名mode
文本文件(ASCII)的打开方式r以只读方式打开文件时,文件必须存在。如果文件不存在,操作将失败。
w以只写方式打开文件时,如果文件不存在,系统将自动创建该文件;如果文件已存在,文件内容将被清空。
a以只写方式打开文件时,如果文件不存在,系统将自动创建该文件;如果文件已存在,写操作将从文件的末尾开始。
r+以读写方式打开文件时,文件必须存在。如果文件不存在,操作将失败。
w+以读写方式打开文件时,如果文件不存在,系统将自动创建该文件;如果文件已存在,文件内容将被清空。
a+以读写方式打开文件时,如果文件不存在,系统将自动创建该文件;如果文件已存在,读写操作将在文件的末尾进行。二进制文件的打开方式rb以只读模式打开二进制文件
wb以只写模式创建二进制文件
ab以写/追加模式打开二进制文件
rb+以读/写模式打开二进制文件
wb+以读/写模式创建二进制文件
ab+以读/写/追加模式打开二进制文件返回值成功流指针失败NULL.执行成功,返回FILE结构体地址,并赋值给文件指针;打开失败,返回一个NULL(空值)的FILE指针。
使用fopen打开文件FILE*fp;if((fp=fopen("file1","r"))==NULL){ printf("Fileopenerror!\n"); exit(0);}return0;示例:打开文件示例。使用fclose关闭文件文件关闭的调用形式:fclose(文件指针);函数原型intfclose(FILE*fp);功能关闭流指针参数fp需要关闭的流指针返回值成功0失败EOF库函数fclose()if(fclose(fp)){printf("Filecloseerror!\n");exit(0);}示例:关闭文件示例。03顺序读写文件顺序读写文件顺序读写文件对于顺序读写操作,数据的读写顺序与数据在文件中的物理顺序是一致的。读写单个字符的函数函数功能返回值fgetc(fp)从文件指针变量fp指向的文件读入一个字符读取成功,返回相应字符,失败则返回
EOF(即-1)fputc(ch,fp)将字符
ch写入fp指向的文件写入成功,返回写入文件的字符返回
ch;如果发生错误,返回EOF(即
-1)
读写字符数据#include<stdio.h>intmain(){FILE*fp;charch;//打开文件进行写操作fp=fopen("example.txt","w");if(fp==NULL){printf("Unabletoopenthefileforwritingoperation!\n");return1;}//向文件中写入单个字符printf("Pleaseenterapieceoftext(pressEntertoend):\n");
//读取用户输入的每个字符,直到回车while((ch=getchar())!='\n'){fputc(ch,fp);//将字符写入文件}//关闭文件fclose(fp);
//打开文件进行读操作fp=fopen("example.txt","r");if(fp==NULL){printf("Unabletoopenthefileforreading!\n");return1;}//从文件中读取单个字符并显示printf("\nThecontentreadfromthefileis:\n");while((ch=fgetc(fp))!=EOF){//读取文件中的每个字符,直到文件结束符putchar(ch);//输出读取的字符}//关闭文件fclose(fp);return0;}示例:使用fgetc和fputc。AI辅助(纯字符):
fgetc和fputc适合处理纯字符数据,比如文本日志。读写字符串数据读写一个字符串的函数函数功能返回值fgets(str,n,fp)从文件指针变量fp指向的文件读入一个长度为(n-1)的字符串(因为读取时会读取'\0'),存放到字符串str中读取成功,返回str,失败则返回NULLfputs(str,fp)将字符串str写到文件指针变量fp所指向的文件中写入成功,返回0;否则返回非0值
读写字符串数据#include<stdio.h>intmain(){FILE*fp;charstr[100];//打开文件进行写操作fp=fopen("example.txt","w");if(fp==NULL){printf("Unabletoopenthefileforwritingoperation!\n");return1;}//向文件中写入字符串printf("Pleaseenteralineoftext(pressEntertofinish):\n");fgets(str,sizeof(str),stdin);//从标准输入读取一行文字fputs(str,fp);//将读取到的字符串写入文件//关闭文件fclose(fp);
示例:使用fgets和fputs//打开文件进行读操作fp=fopen("example.txt","r");if(fp==NULL){printf("Unabletoopenthefileforreadingoperation!\n");return1;}//从文件中读取一行字符串并显示printf("\nThecontentreadfromthefileis:\n");if(fgets(str,sizeof(str),fp)!=NULL){//从文件中读取一行printf("%s",str);//输出读取的字符串}//关闭文件fclose(fp);return0;}AI辅助(删除自动生成的换行符):fgets会读取换行符,若想去除,可手动把最后一个字符设为'\0'。格式化方式读写文本文件基本调用格式fprintf(文件指针,格式字符串,输出列表);fscanf(文件指针,格式字符串,输入列表);从磁盘文件中读取ASCII字符:fscanf(fp,"%d,%f",&i,&f);按格式把数据写入文件按格式从文件读取数据关键代码AI辅助(删除自动生成的换行符):
格式化读写的优点是数据可读性强,能用记事本打开查看,但缺点是占用空间较大,且读写速度稍慢。二进制方式读写文件一般调用形式fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);buffer:一个地址。size:指定每个数据项的字节数。count:指定要读写的数据项数量(每个数据项的长度由size决定)。fp:FILE类型的指针,指向打开的文件。示例fread(f,3,10,fp);f:是一个float型数组(表示数组首元素的地址)。3:每个数据项3字节,存储到f数组中。10:从文件指针fp所指向的文件中,读取10个数据项。函数原型
二进制方式读写文件示例:通过fwrite保存员工数据到磁盘文件中。#include<stdio.h>#include<stdlib.h>#defineSIZE6structEmployee_type{charname[10];intage;intsalary;}emp[SIZE];voidsave(){FILE*fp;inti;//打开文件employees.dat,以只写方式打开二进制文件fp=fopen("employees.dat","wb");if(fp==NULL){printf("Fileopeningfailed!\n");exit(0);}//使用for循环写入员工的信息for(i=0;i<SIZE;i++){ if(fwrite(&emp[i],sizeof(structEmployee_type),1,fp)!=1) printf("Filewriteerror!\n");}//关闭文件fclose(fp);}intmain(){ inti; printf("Pleaseenterdataofemployees:\n"); for(i=0;i<SIZE;i++) scanf("%s%d%d",&emp[i].name,&emp[i].age,&emp[i].salary); save(); return0;}04随机读写文件随机读写文件文件位置标记与定位0102使用rewind函数将文件位置标记指向文件开头。使用fseek函数改变文件位置标记。rewind(fp);fseek(文件类型指针,位移量,起始点);ftell(fp);起始点。使用0、1或2作为起始点,0表示文件开头,1表示当前位置,2表示文件末尾。位移量。以起始点为基准,指定向前或向后的字节数。
位移量应为long类型(在数字末尾加一个L表示long类型)。fseek(fp,50L,0);
//将文件位置标记移动到距离文件开头50个字节处fseek(fp,50L,1);
//将文件位置标记移动到距离当前位置50个字节处fseek(fp,-50,2);
//将文件位置标记从文件末尾向前移动50个字节三个常用函数文件位置标记与定位03使用ftell函数测定文件位置标记的当前位置。ftell(fp);result=ftell(fp);if(result==-1L){printf("error\n");}文件位置标记
随机访问文件数据(1)员工信息文件employees.dat。Zhangsan 358000Lisi 289500 Wangwu 425000 Zhaoliu 307000Qianqi 288900Sunba 226800intmain(){FILE*fp;inti;//打开文件employees.dat,以只读方式打开二进制文件fp=fopen("employees.dat","rb");if(fp==NULL){printf("Thefilefailedtoopen!\n");exit(0);}//使用for循环读取偶数位员工的信息for(i=1;i<6;i+=2){//i=1表示第2位员工,i=3表示第4位员工,i=5表示第6位员工fseek(fp,sizeof(structEmployee_type)*i,0);//跳到第i位员工的位置fread(&emp[i],sizeof(structEmployee_type),1,fp); //读一个数据块到结构体变量printf("%-10s%4d%4d\n",emp[i].name,emp[i].age,emp[i].salary);//输出偶数位员工}//关闭文件fclose(fp);return0;}示例:读取偶数位置(第2、4、6位)的员工信息(利用fseek等函数实现随机读写操作)。(2)参考代码#include<stdio.h>#include<stdlib.h>structEmployee_type{charname[10];intage;intsalary;}emp[6];运行结果05文件综合编程案例文件综合编程案例
文件综合编程案例案例一:创建文本文件并写入字符。#include<stdio.h>intmain(){FILE*fp;//文件指针charc;//打开文件(写入模式),若文件不存在则创建fp=fopen("test1.txt","w");if(fp==NULL){//检查文件是否打开成功printf("无法打开文件!\n");return1;//异常退出}//写入A-Z(ASCII码65-90)for(c='A';c<='Z';c++){fputc(c,fp);//向文件写入一个字符}fclose(fp);//关闭文件printf("文件创建成功,已写入A-Z!\n");return0;}运行结果
文件综合编程案例案例二:读取文本文件并显示内容。#include<stdio.h>intmain(){FILE*fp;charc;intcount=0;//打开文件(只读模式)fp=fopen("test1.txt","r");if(fp==NULL){printf("无法打开文件!\n");return1;}printf("文件内容:");//循环读取字符,直到文件结束(EOF)while((c=fgetc(fp))!=EOF){putchar(c);//显示到屏幕count++;//计数}printf("\n字符总数:%d\n",count);fclose(fp);return0;}运行结果文件综合编程案例#include<stdio.h>#include<string.h>intmain(){FILE*fp;charlines[3][50]={"张三20","李四21","王五22"};//待写入的字符串charbuf[50];//读取缓冲区//写入文件fp=fopen("test2.txt","w");if(fp==NULL){printf("无法打开文件!\n");return1;}for(inti=0;i<3;i++){fputs(lines[i],fp);//写入字符串(不含换行符)fputc('\n',fp);//手动添加换行符}fclose(fp);
案例三:使用字符串函数读写多行文本。//读取文件并显示fp=fopen("test2.txt","r");if(fp==NULL){printf("无法打开文件!\n");return1;}printf("文件内容:\n");while(fgets(buf,50,fp)!=NULL){//每次读取一行(最多49个字符)//去除fgets读取的换行符(可选)if(buf[strlen(buf)-1]=='\n'){buf[strlen(buf)-1]='\0';}printf("%s\n",buf);}fclose(fp);return0;}运行结果文件综合编程案例#include<stdio.h>structStudent{//学生信息结构体intid;charname[20];floatscore;};intmain(){FILE*fp;structStudentstu[3]={{101,"张三",90.5},{102,"李四",85.0},{103,"王五",92.5}};structStudenttemp;//临时存储读取的学生信息//写入文件(格式化方式)fp=fopen("students.txt","w");if(fp==NULL){printf("无法打开文件!\n");return1;}案例四:格式化读写学生信息(文本文件)。for(inti=0;i<3;i++){//按格式写入:学号
姓名
成绩fprintf(fp,"%d%s%.1f\n",stu[i].id,stu[i].name,stu[i].score);}fclose(fp);//读取文件(格式化方式)fp=fopen("students.txt","r");if(fp==NULL){printf("无法打开文件!\n");return1;}printf("学生信息:\n");printf("学号\t姓名\t成绩\n");while(fscanf(fp,"%d%s%f",&temp.id,,&temp.score)!=EOF){//按格式读取,直到文件结束printf("%d\t%s\t%.1f\n",temp.id,,temp.score);}fclose(fp);return0;}运行结果:文件综合编程案例#include<stdio.h>structStudent{intid;charname[20];floatscore;};intmain(){FILE*fp;structStudentstu[3]={{101,"张三",90.5},{102,"李四",85.0},{103,"王五",92.5}};structStudenttemp;inti;//二进制写入fp=fopen("students.dat","wb");//"wb"表示二进制写if(fp==NULL){printf("无法打开文件!\n");return1;}
案例五:二进制方式读写结构体数据。//写入整个结构体数组(3个元素)fwrite(stu,sizeof(structStudent),3,fp);fclose(fp);//二进制读取fp=fopen("students.dat","rb");//"rb"表示二进制读取if(fp==NULL){printf("无法打开文件!\n");return1;}printf("学生信息(二进制读取):\n");printf("学号\t姓名\t成绩\n");//循环读取3个结构体for(i=0;i<3;i++){fread(&temp,sizeof(structStudent),1,fp);//每次读1个结构体printf("%d\t%s\t%.1f\n",temp.id,,temp.score);}fclose(fp);return0;}运行结果:文件综合编程案例#include<stdio.h>structStudent{intid;charname[20];floatscore;};intmain(){FILE*fp;structStudenttemp;inttargetI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年安徽省军队转业干部统一考试(公共基础知识)综合能力测试题及答案
- 2025年浙江嘉兴住房和城乡建设领域现场专业人员培训考试(监理员)题库及答案
- 农机液压电控系统性能调校方案
- 2025年价格鉴证师考试题库(附答案和详细解析)
- 2025年江西省抚州市东乡区选调考试综合应用能力测试+职业能力倾向测试训练题及答案
- 2025年湖北公开遴选公务员考试(行政执法类)练习题及答案
- 2026年第二季度意识形态研判报告
- 学校食堂采购询价制度及流程(2026版)
- 2026及未来5年中国固有荧光早期肿瘤诊断仪行业发展研究报告
- 2026及未来5年中国厨具刀片行业发展市场调查数据研究报告
- 2026年马鞍山市花山区社区工作者招聘考试综合能力测验试题及答案
- 2026江苏徐州市新盛集团下属城商集团招聘12人笔试备考试题及答案详解
- ICU患者突发呼吸衰竭应急预案演练脚本
- 山东科技大学2026年综合评价招生《笔试+面试》模拟试题及参考答案
- 2025年《材料加工和成型工艺》考试复习题(含答案)
- 2025年江苏省扬州市八年级地生会考真题试卷+答案
- 2026年世界环境日环保知识线上挑战赛题库
- 2025中远海运集装箱运输有限公司所属公司招聘4人笔试历年参考题库附带答案详解
- 小学党支部书记思政第一课教学设计:听党话跟党走做新时代好少年
- 耳部全息铜砭刮痧法
- 住宅小区年度物业服务满意度调查表
评论
0/150
提交评论