




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章文件教学目标1.了解C语言中文件的使用方法;2.能够读写文本文件和二进制文件;3.掌握顺序读写和随机读写函数的用法。教学内容文件的相关操作10.2
文件的相关概念10.1第9章文件想一想C语言编程为什么需要使用文件?编程计算10名学生平均成绩,每一次运行程序都要重复输入10名学生的成绩。如何做到一次输入,下次运行程序重复使用?内存:临时存储数据磁盘(外存):长期保存数据,可以使用文件,将数据存储到磁盘上。10.1文件的相关概念“文件”:就是记载在外部存储器上的数据集合,是存储数据的载体。在C语言中,把这些数据的集合看成是字符或者字节序列(或称:有序的“字节流”),处理这些文件时,并不区分文件类型,而是按字节处理。EOF012345n-1结束标志10.1文件的相关概念文件的分类按数据的组织形式:文本文件、二进制文件按文件存储格式:源程序文件、数据文件、图形图像文件、音频文件、视频文件、可执行文件按照保护级别:只读文件、只写文件、可读可写文件等按照保存期限:临时文件、永久文件C语言程序输入输出操作涉及的数据文件10.1文件的相关概念文件的缓冲区使用缓冲区的目的:减少对磁盘的实际读写次数,提高读、写操作的速度。从磁盘文件读入数据:一次将一批数据读到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送给接收变量。向磁盘文件写数据:先将数据送到内存缓冲区,装满缓冲区后才一起写到磁盘文件。用缓冲区可以一次输入或输出一批数据,而不是执行一次输入或输出操作就访问一次磁盘。10.1文件的相关概念文件的缓冲区C语言两大类磁盘文件系统:“缓冲文件系统”:系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。→标准I/O(标准输入输出)“非缓冲文件系统”:系统不自动设置缓冲区,而由用户根据需要设置。→系统I/O(系统输入输出)stdio.h头文件10.2文件的相关操作对文件的两种操作:
“读”----“输入”“写”----“输出”从键盘(stdin)输入,从手写板输入,都是读数据,将数据读入内存中。将文件中数据读入内存就称为“读”文件,也称为文件的输入;将内存中的数据输出到显示器(stdout),输出到打印机,都是写数据,将内存中的数据写入到文件,就称为“写”文件,也称为文件的输出。10.2文件的相关操作C语言文件操作步骤分为四步:①定义文件指针②打开文件③读或写文件④关闭文件重点:记住各种函数的用法10.2文件的相关操作1.定义文件指针文件操作之前必须要先定义文件指针变量,记录文件当前的读写位置(相当于word文件和EXCEL文件中的光标)定义形式:FILE*<变量标识符>;如:FILE*fp;
则:fp为指向FILE类型结构体的指针变量(FILE:已经定义的结构体数据类型,类型定义在stdio.h头文件中;)10.2文件的相关操作1.定义文件指针文件指针类型FILE的定义stdio.h头文件中对文件指针类型的定义如下:typedefstruct{shortlevel;unsignedflags;charfd;unsignedcharhold;shortbsize;unsignedchar*buffer;unsignedchar*curp;//当前激活指针unsignedistemp;shorttoken;}FILE;10.2文件的相关操作2.文件的打开与关闭文件打开函数原型
FILE*fopen(char*filename,char*type);filename:字符串,文件名,可以是带有路径的文件名,可以在当前工作目录(相对路径)下;也可以在指定路径(绝对路径)下;type:字符串,操作模式,不同的模式对应不同的操作,对文本文件和二进制文件分别使用不同的操作模式;函数返回值:成功→文件指针;失败→NULL。10.2文件的相关操作2.文件的打开与关闭常用的6种打开模式文本文件r
以只读方式打开w
以只写方式打开a
以追加方式打开r+
以读/写方式打开w+
以读/写方式建新文件a+
以读/写方式打开二进制文件rb
以只读方式打开wb
以只写方式打开ab
以追加方式打开rb+
以读/写方式打开wb+
以读/写方式建新文件ab+
以读/写方式打开注:并不是所有的C语言系统都具备以上文件操作模式,与编译器有关。10.2文件的相关操作例题2.文件的打开与关闭【例题10_1】/*p10_1.c文件打开方式1*/#include<stdio.h>voidmain(){
FILE*fp;fp=fopen("myfile1.txt","r");if(fp==NULL)printf("fileopenerror!\n");elseprintf("fileopenOK!\n");fclose(fp);}问题:1.myfile1.txt文件在哪里?2.如果myfile1.txt文件不存在,会怎样?与当前程序在同一个文件夹打开失败,返回NULL10.2文件的相关操作例题2.文件的打开与关闭【例题10_2】/*p10_2.c文件打开方式2*/#include<stdio.h>voidmain(){
FILE*fp;fp=fopen("c:\\myfile2.txt","w");if(fp==NULL)printf("fileopenerror!\n");elseprintf("fileopenOK!\n");}问题:1.myfile2.txt文件在哪里?2.如果myfile2.txt文件不存在,会怎样?在C盘根目录下创建新文件,打开成功10.2文件的相关操作例题2.文件的打开与关闭【例题10_3】/*p10_3.c文件打开方式3*/#include<stdio.h>#include<stdlib.h>voidmain(){FILE*fp;if((fp=fopen("myfile3.txt","a"))==NULL){printf("fileopenerror!\n");exit(0);}else{printf("FileopenisOK!\n");
/*此处为读写文件的操作代码*/}fclose(fp);}问题:1.红色括号是否必须有?必须有,==优先于=2.如果myfile3.txt文件不存在,会怎样?创建新文件,打开成功10.2文件的相关操作2.文件的打开与关闭文件关闭函数原型为:intfclose(FILE*fp);fp:文件指针,指向一个已经打开的文件;例:fclose(fp);函数返回值:0-表示文件关闭正确;非0值-表示文件关闭失败。文件使用完要关闭,否则有可能造成数据丢失!10.2文件的相关操作3.文件读写函数读写文件两种方式:“顺序读写”:文件被打开后,按照数据流的先后顺序对文件进行从前向后按顺序读/写操作,每读/写一次,文件指针自动指向下一个读/写位置。“直接读写”:又称随机读写,是指先通过库函数指定要开始读写的字节号,将文件指针进行准确定位,然后从此位置开始对文件内容进行读或写操作。直接读写适合于具有固定长度记录的文件。10.2文件的相关操作3.文件读写函数C语言文件读写函数声明在stdio.h头文件中,主要有四组,分别为:fgetc()/fputc:读写字符fgets()/fputs:读写字符串fscanf()/fprintf:格式化读写fread()/fwrite():按块读写对文本文件,一般按字符、按字符串读写,或者格式化读写;对二进制文件,一般进行成块读写或者格式化读写。10.2文件的相关操作3.文件读写函数1)字符读写函数向文件中写一个字符:原型:charfputc(charch,FILE*fp);函数返回值:写入正确→返回字符ch;错误→返回-1(EOF)ch:待输出的某个字符,可以是一个字符常量,也可以是一个字符变量;fp:文件指针,指向一个已经打开的文件例:fputc(ch,fp);作用:将字符ch写入fp指针所指的文件位置。【例题10_4】从键盘输入一系列字符,原样写入文件file1.txt,用字符*做结束标志。#include<stdio.h>#include<stdlib.h>voidmain(){FILE*fp;charch;fp=fopen("file1.txt","w");if(fp==NULL)
{printf("fileopenerror!\n");
return;}//exit(0);printf("请连续输入字符:\n");ch=getchar();while(ch!='*')
{
fputc(ch,fp); ch=getchar();}fclose(fp);}10.2文件的相关操作3.文件读写函数1)字符读写函数从文件中读一个字符原型:intfgetc(FILE*fp);函数返回值:成功→返回字符的ASCII码错误或到达文件尾→返回-1(EOF)fp:文件指针,指向一个已经打开的文件例:while((ch=fgetc(fp))!=EOF)作用:从文件指针fp所指文件中读一个字符存入字符变量ch(事先已经定义),读取成功未到文件尾部(ch!=EOF),则执行循环体里的语句,到文件尾部(ch==EOF)则退出循环。【例题10_5】将文件file1.txt中的内容逐个字符读出来,原样显示在屏幕上。
#include<stdio.h>#include<stdlib.h>voidmain(){FILE*fp;charch;fp=fopen("file1.txt","r");if(fp==NULL)
{
printf("fileopenerror!\n");
return;
}printf("读出的字符是:\n");
ch=fgetc(fp);while(ch!=EOF)
{ putchar(ch);
ch=fgetc(fp); }putchar('\n');fclose(fp);}10.2文件的相关操作3.文件读写函数提示:每读/写一次,文件指针自动指向下一个位置;读取文件时,一定要先读一次,再判断文件是否结束。循环语句中一定要有再次读文件的语句。10.2文件的相关操作3.文件读写函数2)字符串读写函数从文件中读取字符串:char*fgets(char*string,intn,FILE*
fp);返回值:正确→返回地址string;错误→返回NULLstring:字符型指针,表示字符串的起始地址n:读取字符串最长n-1个字符,回车换行符也是一个字符。如果提前遇到回车或文件结束符,则操作提前结束。读取结束后,自动在读入的字符串后面加一个“\0”作为字符串结束标志。fp:文件指针,指向一个已经打开的文件10.2文件的相关操作3.文件读写函数2)字符串读写函数例:fgets(ch,10,fp);作用:从文件指针fp所指文件位置读取9个字符,放到以ch为起始地址的存储空间,若在9个字符前,遇到回车换行符或文件结束符,则操作结束。读取结束后在读入的字符串后面加一个“\0”字符作为字符串结束标识。10.2文件的相关操作3.文件读写函数2)字符串读写函数向文件写入字符串:原型:intfputs(char*str,FILE*fp);返回值:正确→返回非负数;错误→返回-1(EOF)str:要写入文件的字符串。可以是字符串常量,也可以是指向字符串的指针或字符型数组;fp:文件指针,指向一个已经打开的文件例:fputs("你好啊!",fp);作用:将字符串"你好啊!"保存到文件指针fp所指的文件位置。【例题10_6】改进【例题10_4】,用读写字符串函数实现从键盘输入一行字符写入文本文件,文件名字由用户指定
#include<stdio.h>#include<stdlib.h>#include<string.h>voidmain(){FILE*fp;charstr[20],name[20];printf("请输入文件名:\n");gets(name);fp=fopen(name,"w");if(fp==NULL){printf("fileopenerror!\n");
return; }printf("请输入字符串:\n");while(strlen(gets(str))>0)
fputs(str,fp);fclose(fp);}【例题10_7】改进【例题10_5】,用字符串读写函数将【例题10_6】创建的文件内容串读出来,原样显示在屏幕上
#include<stdio.h>#include<stdlib.h>voidmain(){FILE*fp;charstr[20],name[20];printf("请输入文件名:\n");gets(name);fp=fopen(name,"r");if(fp==NULL){printf("fileopenerror!\n");
return; }printf("读出的字符是:\n");while(fgets(str,20,fp)!=NULL)puts(str);fclose(fp);}10.2文件的相关操作习题如下程序执行后,文件t1.dat中的内容是()。#include<stdio.h>#include<stdlib.h>voidWriteStrn(char*fn,char*str){FILE*fp;chars;fp=fopen(fn,"w");fputs(str,fp);fclose(fp);}voidmain(){WriteStrn("t1.dat","start");WriteStrn("t1.dat","end");}A.startB.endC.startendD.endtB10.2文件的相关操作3.文件读写函数3)格式化读写函数格式化读函数原型:intfscanf(FILE*fp,char*format,&arg1,&arg2,…,&argn);&arg1,&arg2,…,&argn:输入项列表,与scanf()函数一致format:格式控制字符,与scanf()函数一致fp:文件指针,指向一个已经打开的文件例:fscanf(fp,"%d%d",&a,&b);作用:从fp所指文件位置读两个整数,分别存入变量a和b中,变量a和b事先已经正确定义,两个整数之间以空格(或者跳格符、回车换行符)分隔。10.2文件的相关操作3.文件读写函数3)格式化读写函数格式化写函数原型:intfprintf(FILE*fp,char*format,arg1,arg2,…argn)&arg1,&arg2,…,&argn:输出项列表,与printf()函数一致format:格式控制字符,与printf()函数一致fp:文件指针,指向一个已经打开的文件例:fprintf(fp,"%d%s\n",i,name);作用:向fp指针所指文件位置写两个数据,一个整数,一个字符串。变量i和name已经正确定义,并存入数据。为了便于读文件数据,格式符中加了空格进行分隔【例题10_8】编写程序,输入5名学生的成绩、姓名,存在文本文件cj.txt中,每个学生一行,垂直对齐。
#include<stdio.h>#include<stdlib.h>voidmain(){FILE*fp;intcj,i;charname[8];fp=fopen("cj.txt","w");if(fp==NULL){printf("fileopenerror!\n");
return; }for(i=1;i<=5;i++){printf("第%d名学生的成绩、姓名:",i);
scanf("%d%s",&cj,name);
fprintf(fp,"%d\t%s\n",cj,name); }fclose(fp);}问:为何不需要定义结构体数组存学生成绩?【例题10_9】编写程序,将文本cj.txt文件中读出,原样显示在屏幕上。
#include<stdio.h>#include<stdlib.h>voidmain(){FILE*fp;intcj,i;charname[8];fp=fopen("cj.txt","r");if(fp==NULL){printf("fileopenerror!\n");exit(0);}for(i=1;i<=5;i++){ printf("第%d名学生:",i);
fscanf(fp,"%d%s",&cj,name);printf("%d\t%s\n",cj,name); }fclose(fp);}【例题10_10】用格式化读写函数读写二进制文件
#include<stdio.h>#include<stdlib.h>voidmain(){FILE*fp;intcj,i;charname[8];fp=fopen("cj.dat","wb+");if(fp==NULL){printf("fileopenerror!\n");exit(0);}printf("【输入数据】\n");for(i=1;i<=3;i++)
{ printf("第%d名学生的成绩、姓名:",i); scanf("%d%s",&cj,name);
fprintf(fp,"%d\t%s\n",cj,name);
}
rewind(fp);//文件位置指针重新返回到文件的开头printf("\n【输出数据】\n");
for(i=1;i<=3;i++){printf("第%d名学生:",i);
fscanf(fp,"%d%s",&cj,name);
printf("%d\t%s\n",cj,name);
}fclose(fp);}【输入数据】第1名学生的成绩、姓名:90张三第2名学生的成绩、姓名:87李四第3名学生的成绩、姓名:97王五【输出数据】第1名学生:90张三第2名学生:87李四第3名学生:97王五10.2文件的相关操作3.文件读写函数4)按块读写函数①按块读函数:原型:intfread(void*buf,intsize,intcount,FILE*fp);buf:数据块指针,准备读数据的内存首地址,通常为字符数组size:每个数据块的字节数count:每读写一次,输入或输出的数据块个数fp:文件指针,指向一个已经打开的文件返回值:成功→返回数据项数(count的值),出错或到达文件尾→返回小于count的值作用:从fp所指的文件中读取count个数据项,每一个数据项的长度为
size个字节,放到由buf所指的块中(buf通常为字符数组)。读取的
字节总数为size×count。10.2文件的相关操作3.文件读写函数4)按块读写函数②按块写函数:原型:intfwrite(void*buf,intsize,intcount,FILE*fp)buf:数据块指针,准备写数据的内存首地址,通常为字符数组size:每个数据块的字节数count:每读写一次,输入或输出的数据块个数fp:文件指针,指向一个已经打开的文件返回值:成功→返回数据项数(count的值),出错→返回小于count的值作用:将count个长度为size的数据项写到fp所指的文件流中去【例题10_11】输入5名学生的序号、姓名、成绩,使用按块读写函数保存在二进制文件st.dat中,每个学生一行,垂直对齐#include<stdio.h>#include<stdlib.h>voidmain(){
FILE*fp; inti;structs
{intxh;charname[8];intcj;}ss[5];fp=fopen("st.dat","ab");if(fp==NULL)
{printf("fileopenerror!\n");exit(0); }for(i=0;i<5;i++)
{
ss[i].xh=i+1; printf("第%d名学生的姓名:",i+1); scanf("%s",&ss[i].name); printf("第%d名学生的成绩:",i+1); scanf("%d",&ss[i].cj);
fwrite(&ss[i],sizeof(structs),1,fp);
}fclose(fp);}【例题10_12】编写程序,将二进制文件st.dat中的学生数据读出来,显示在屏幕上。st.dat中,每个学生一行,垂直对齐#include<stdio.h>#include<stdlib.h>voidmain(){
FILE*fp;inti=0;structs
{intxh;charname[8];intcj;}ss[30];fp=fopen("st.dat","rb");if(fp==NULL)
{printf("fileopenerror!\n");exit(0); }fread(&ss[i],sizeof(structs),1,fp);while(!feof(fp))
{
printf("序号:%d\t姓名:%s",ss[i].xh,ss[i].name); printf("\t成绩:%d:\n",ss[i].cj); i++;
fread(&ss[i],sizeof(structs),1,fp);
}fclose(fp);}序号:1姓名:张三成绩:80:序号:2姓名:李四成绩:90:序号:3姓名:王五成绩:87:序号:4姓名:赵六成绩:79:序号:5姓名:郑琦成绩:86:1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Unit 3 The art of painting Extended reading (2) 教学设计-2024-2025学年高中英语译林版(2020)选择性必修第一册
- 浙江工商职业技术学院《国际贸易理论与政策》2023-2024学年第二学期期末试卷
- 重庆文化艺术职业学院《建筑工程质量控制》2023-2024学年第二学期期末试卷
- 江西新能源科技职业学院《视频特技与非线性编辑》2023-2024学年第二学期期末试卷
- 中国石油大学(华东)《参展实务》2023-2024学年第二学期期末试卷
- 辽宁装备制造职业技术学院《单片机原理课程设计》2023-2024学年第二学期期末试卷
- 可克达拉职业技术学院《社会调查原理与方法》2023-2024学年第二学期期末试卷
- 潍坊环境工程职业学院《物联网通信技术》2023-2024学年第二学期期末试卷
- 湖南城市学院《MBA运营管理》2023-2024学年第二学期期末试卷
- 永城职业学院《音乐教学与技能训练》2023-2024学年第二学期期末试卷
- SHT 3005-2016 石油化工自动化仪表选型设计规范
- 2024年苏州卫生职业技术学院单招职业适应性测试题库及答案解析
- 阳光分级阅读 Letters for Mr James 课件
- 占道作业交通安全设施设置技术要求
- 《肝豆状核变性》课件
- 地铁施工管线保护培训课件
- 农村公路质量监督管理及措施
- 小学体积单位换算练习100道及答案
- 第7课《谁是最可爱的人》公开课一等奖创新教学设计-2
- 人音版四年级音乐下册全册教学设计教案表格式
- 渣土车司机安全培训
评论
0/150
提交评论