《(5.11.1)--翻转课补充课件-第22讲-文件程序设计基础.ppt》由会员分享,可在线阅读,更多相关《(5.11.1)--翻转课补充课件-第22讲-文件程序设计基础.ppt(66页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言程序设计语言程序设计 The C Programming Language 第第22讲讲 文件文件-2-第第22讲讲 文件文件9.1 文件的概念 9.2 文件的基本操作 作业布置 9.4提高部分课堂总结 9.3 贯穿实例A(7)9.1 9.1 文件的概述文件的概述文件的概念文件的概念 文件文件 存储在外部介质(如磁盘)上的存储在外部介质(如磁盘)上的数据的集合数据的集合按介质划分按介质划分:磁盘文件、磁带文件:磁盘文件、磁带文件按文件内容划分按文件内容划分:源程序文件、数据文件:源程序文件、数据文件按组织形式划分按组织形式划分:文本文件和二进制文件:文本文件和二进制文件 P280文本文件
2、和二进制文件文本文件和二进制文件 00000001 10110000 00000100 00000011 00000010432 占占2个字节个字节432按二进制文件存储按二进制文件存储 按文本文件存储按文本文件存储 不能用记事本显示不能用记事本显示 能用记事本显示能用记事本显示 但速度快但速度快 但速度慢但速度慢 占占3个字节个字节 文本文件和二进制文件文本文件和二进制文件 1.234 占占4个字节个字节 1 2按二进制文件存储按二进制文件存储 按文本文件存储按文本文件存储 .3 4 占占5个字节个字节特点:特点:文件中存放的都是数据,这些数文件中存放的都是数据,这些数据可以长期保留,可以随
3、时存取据可以长期保留,可以随时存取 数据文件数据文件 9.2 9.2 文件的基本操作文件的基本操作v“写写”文件文件:将数据从内存输出到磁:将数据从内存输出到磁盘盘文件文件v“读读”文件文件:从已建立的数据文件中:从已建立的数据文件中将将所要的数据输入到内存所要的数据输入到内存 P281【例例9.1】向文件输出数据的示例向文件输出数据的示例 将将“Lets study the C language.”输出到一个文本文件输出到一个文本文件 向向文文件件输输出出字字符符串串的的操操作作与与用用printf进进行行“输出输出”十分相似十分相似对文件进行操作时,需要先打开文件,对文件进行操作时,需要先
4、打开文件,操作完毕还要关闭文件操作完毕还要关闭文件 编程点拨编程点拨#include main()char a80=Lets study the C language.;FILE*fp=NULL;fp=fopen(a.txt,w);fprintf(fp,%s,a);fclose(fp);定义文件指针定义文件指针fp 用用“写写”方式打方式打开文本文件开文本文件a.txt 将数组将数组a中的字符串输中的字符串输出到出到fp所指的文件中所指的文件中 关闭文件关闭文件 屏幕上无任何显示屏幕上无任何显示【例例9.2】从文件读取数据的示例从文件读取数据的示例 将例将例9.1所建文件所建文件“a.txt”
5、中的内容中的内容 读取出来,并输出到屏幕上读取出来,并输出到屏幕上 从文件读取数据的操作与用从文件读取数据的操作与用scanf 进行进行“输入输入”十分相似十分相似也需要先打开文件,操作完毕后关闭文件也需要先打开文件,操作完毕后关闭文件 编程点拨编程点拨#include main()char a80=;FILE*fp=NULL;fp=fopen(a.txt,r);fscanf(fp,%s,a);puts(a);fclose(fp);为为“读取读取”打开打开文本文件文本文件a.txt 从从fp所指的文件中读入字所指的文件中读入字符串,并存放在数组符串,并存放在数组a中中 Lets注意:不输出注意
6、:不输出Lets study the C language.文件操作的说明:文件操作的说明:v 定义文件指针定义文件指针 FILE *文件指针名文件指针名;文件指针是一个名为文件指针是一个名为FILE(必须大写)(必须大写)的结构体类型的指针的结构体类型的指针 需要加需要加#include v打开文件打开文件 fopen(文件名,(文件名,打开方式打开方式)字符串字符串 fp=fopen(a.txt,r);if(fp=NULL)printf(Cant open this file);exit(0);单击可查单击可查看看文件操作的说明:文件操作的说明:单击此单击此处查看处查看v 标准输入输出函数
7、标准输入输出函数 文件的读写操作是通过调用标准文件的读写操作是通过调用标准输入输出函数完成输入输出函数完成v 关闭文件关闭文件 fclose(文件指针)(文件指针)讨论题讨论题10.110.1 要将文件要将文件a.txt中的字符串复制到文件中的字符串复制到文件c.txt中,需要几个文件指针?两个中,需要几个文件指针?两个文件应按什么方式打开?文件应按什么方式打开?【例例9.3】输入若干学生的成绩输入若干学生的成绩(整型整型),用用-1结束,调用结束,调用fprintf函数,函数,按格式将学生的成绩写入按格式将学生的成绩写入d:b.txt中中#include#include main()FILE
8、 *fp=NULL;int a=0;fp=fopen(d:b.txt,w);if(fp=NULL)printf(Cant open file!n);exit(0);scanf(%d,&a);while(a!=-1)fprintf(fp,%4d,a);scanf(%d,&a);fclose(fp);60 70 90 100 80 60 1 屏屏幕幕上上无无任任何何信信息息,但但在在d盘盘下下可可以以找找到到b.txt文文件件,且且文文件件中中的的内内容容是是:60 70 90 100 80 60 如果没有如果没有d盘,则文件打开失败,这时屏盘,则文件打开失败,这时屏幕上显示信息:幕上显示信息:“
9、Cant open file!”,然后结束程序的执行,然后结束程序的执行【例例9.4】调用调用fscanf函数,按格式读函数,按格式读取例取例10.3所建文件所建文件d:b.txt中的学生成绩,中的学生成绩,并在终端屏幕上输出最高并在终端屏幕上输出最高成绩成绩#include#include main()FILE *fp=NULL;int a=0,max=0;fp=fopen(d:b.txt,r);if(fp=NULL)printf(Cant open file!n);exit(0);while(feof(fp)=0)fscanf(fp,%d,&a);printf(%4d,a);if(max
10、a)max=a;printf(n max=%dn,max);fclose(fp);若非文件尾,继续若非文件尾,继续 到文件尾时,到文件尾时,feof(fp)为为1【例例9.5】假设学生基本情况包括学号和假设学生基本情况包括学号和一门课成绩,从键盘输入若一门课成绩,从键盘输入若干学生的学号和成绩,写入干学生的学号和成绩,写入文件文件d:stu01.txt中,用中,用-1结束成绩输入结束成绩输入#include#include struct aaa char num10;int s;main()struct aaa stu=0;FILE *fp=NULL;fp=fopen(d:stu01.txt,
11、w);if(fp=NULL)printf(Cant open file!n);exit(0);scanf(%s%d,stu.num,&stu.s);while(stu.s!=-1)fprintf(fp,%10s%4dn,stu.num,stu.s);scanf(%s%d,stu.num,&stu.s);fclose(fp);1001 67 1002 79 1003 99 1004 100 1005 87 1 1 stu01.txt的内容:的内容:1001 67 1002 79 1003 99 1004 100 1005 87【例例9.6】编写程序从例编写程序从例10.5所建文件所建文件d:st
12、u01.txt中读取所有中读取所有学生数据,输出成绩最高学生数据,输出成绩最高的学生信息的学生信息#include#include#define N 50struct aaa char num10;int s;main()int k=0,i=0,n=0;FILE*fp=NULL;struct aaa stuN=0;fp=fopen(d:stu01.txt,r);if(fp=NULL)printf(Cant open file!n);exit(0);while(feof(fp)=0)fscanf(fp,%10s%4dn,stun.num,&stun.s);printf(%10s%4dn,stun
13、.num,stun.s);n+;printf(n);k=0;for(i=0;in;i+)if(stuk.sstui.s)k=i;printf(%10s%4dn,stuk.num,stuk.s);fclose(fp);【例例9.7】编写程序修改例编写程序修改例9.5所建文件所建文件d:stu01.txt中最后一个学中最后一个学生的信息生的信息#include#include#define N 50 struct aaa char num10;int s;main()int i=0,n=0;struct aaa stuN=0;FILE *fp=NULL;fp=fopen(d:stu01.txt,r
14、);if(fp=NULL)printf(Cant open file!n);exit(0);while(feof(fp)=0)fscanf(fp,%s%dn,stun.num,&stun.s);printf(%10s%4dn,stun.num,stun.s);n+;fclose(fp);printf(Input:data:);scanf(%s%d,stun-1.num,&stun-1.s);fp=fopen(d:stu01.txt,w);if(fp=NULL)printf(Cant open file!n);exit(0);for(i=0;in;i+)fprintf(fp,%10s%4dn,s
15、tui.num,stui.s);fclose(fp);读写文件方式读写文件方式:顺序读写方式顺序读写方式 随机读写方式随机读写方式 打打 开方开方 式式功功 能能 文本文件文本文件 二进制文件二进制文件 rrb仅为读打开已有文件仅为读打开已有文件wwb仅为写打开仅为写打开aab为追加打开为追加打开r+rb+为读写打开已有文件为读写打开已有文件w+wb+为读写打开为读写打开a+ab+为读写打开为读写打开教材的表教材的表9.1中有中有更详细的说明更详细的说明9.3 9.3 贯穿实例贯穿实例A A(7)成绩管理程序之七:完善成绩管理程序之七:完善8.3节的贯穿实节的贯穿实例例A,即用文件改写该实例。
16、,即用文件改写该实例。P2899.4 9.4 提高部分提高部分9.4.1 文件读写操作的进一步讨论文件读写操作的进一步讨论9.4.2 文件的定位操作文件的定位操作P2959.4.1 9.4.1 文件读写操作的进一步讨论文件读写操作的进一步讨论C语言提供的文件读写函数:语言提供的文件读写函数:fscanf、fprintffgetc、fputcfgets、fputsfread、fwriteP295【例例9.8】调用调用fputc函数将输入的函数将输入的学生姓名、电话号码写入文件,输学生姓名、电话号码写入文件,输入以入以#作为结束标志作为结束标志#include#include main()FILE
17、*fp=NULL;char ch=0;fp=fopen(d:a1.txt,w);if(fp=NULL)printf(Cant open this file!n);exit(0);ch=getchar();while(ch!=#)fputc(ch,fp);ch=getchar();fclose(fp);【程序说明程序说明】fputc函数:将字符输出到文件。函数:将字符输出到文件。fputc(ch,fp);ch:字符型变量:字符型变量fp:要写入的文件指针:要写入的文件指针将将ch中的字符写入中的字符写入fp所指向的文件所指向的文件【例例9.9】调用调用fgetc函数依次读取文函数依次读取文件中的
18、字符,并显示在屏幕上。件中的字符,并显示在屏幕上。#include#include main()FILE*fp=NULL;char ch=0;fp=fopen(d:a1.txt,r);if(fp=NULL)printf(Cant open this file!n);exit(0);ch=fgetc(fp);while(ch!=EOF)putchar(ch);ch=fgetc(fp);fclose(fp);【程序说明程序说明】fgetc函数:从文件读一个字符函数:从文件读一个字符EOF文件的结束标志文件的结束标志值为值为-1【9.10】调用调用fputs函数在文件尾部函数在文件尾部追加若干学生的
19、姓名和电话号码,操追加若干学生的姓名和电话号码,操作以输入空串作为结束作以输入空串作为结束#include#include#include main()FILE*fp=NULL;char a80=;fp=fopen(d:a1.txt,a);if(fp=NULL)printf(Cant open!n);exit(0);gets(a);while(strcmp(a,)!=0)fputs(a,fp);fputs(n,fp);gets(a);fclose(fp);【程序说明】fp=fopen(d:a1.txt,a);a:追加追加fputs(a,fp);将将a中字符串写入文件中字符串写入文件注意:注意:
20、a串尾部的串尾部的0不写入文件不写入文件fputs(n,fp);控制每个字符串占一行控制每个字符串占一行【9.11】调用调用fgets函数读取文件中的学函数读取文件中的学生信息,并将这些信息输出在屏幕上。生信息,并将这些信息输出在屏幕上。#include#include main()FILE*fp=NULL;char a80=;int i=0,n=0;fp=fopen(d:a1.txt,r);if(fp=NULL)printf(Cant open!n);exit(0);while(feof(fp)=0)fgets(a,80,fp);n+;fclose(fp);fp=fopen(d:a1.txt
21、,r);if(fp=NULL)printf(Cant open!n);exit(0);for(i=1;in;i+)fgets(a,80,fp);printf(%s,a);fclose(fp);【程序说明】fgets(a,80,fp);第第1个参数个参数a:存放字符串的内存地址:存放字符串的内存地址第第2个参数个参数80:最多能读取字符的个数:最多能读取字符的个数第第3个参数个参数fp:从哪个文件读数据:从哪个文件读数据【9.12】调用调用fwrite函数,将函数,将5名学生的姓名学生的姓名和学号写入二进制文件名和学号写入二进制文件d:w.dat#include#include struct s
22、tudent char name20;int num;main()struct student tel5=Jia,8888,Yi,7777,Bin,6666,Ding,5555,Wu,4444;int i=0;FILE*fp=NULL;fp=fopen(d:w.dat,wb);if(fp=NULL)printf(Cant open!n);exit(0);for(i=0;i5;i+)fwrite(tel+i,sizeof(struct student),1,fp);fclose(fp);【程序说明】二进制文件打开方式:二进制文件打开方式:fp=fopen(d:w.dat,wb);fwrite(t
23、el+i,sizeof(struct student),1,fp);tel+i:依次代表每个数据块的地址,即每个数组元素:依次代表每个数据块的地址,即每个数组元素sizeof(struct student):每个数据块的大小:每个数据块的大小1:每次写一个数据块:每次写一个数据块fp:要写的文件:要写的文件【9.13】调用调用fread函数,按数据块方式从函数,按数据块方式从二进制文件二进制文件d:w.dat中读取数据,然后显示中读取数据,然后显示在屏幕上。在屏幕上。#include#include struct student char name20;int num;main()int i=
24、0;FILE*fp=NULL;struct student a=0;fp=fopen(d:w.dat,rb);if(fp=NULL)printf(Cant open!n);exit(0);for(i=0;i5;i+)fread(&a,sizeof(struct student),1,fp);printf(%s%d ,a.name,a.num);fclose(fp);【程序说明】fread(&a,sizeof(struct student),1,fp);&a:表示:表示a的地址,读出来的数据放在的地址,读出来的数据放在a中中sizeof(struct student):一次所读数据块的字节数:一
25、次所读数据块的字节数1:每次读一个数据块:每次读一个数据块fp:文件指针:文件指针9.4.29.4.2文件的定位操作文件的定位操作随机读写:对于二进制文件可以采取定随机读写:对于二进制文件可以采取定位直接读写位直接读写fseek:定位:定位ftell:获取当前位置指针的位置:获取当前位置指针的位置rewind:使位置指针回到开头:使位置指针回到开头P300【9.14】使用文件定位函数,读取文件使用文件定位函数,读取文件d:w.dat中的信息,然后显示在屏幕上,并中的信息,然后显示在屏幕上,并统计文件的总字节数。统计文件的总字节数。#include#include struct student
26、char name20;int num;main()int i=0,n=0;FILE*fp=NULL;struct student a=0;fp=fopen(d:w.dat,rb);if(fp=NULL)printf(Cant open!n);exit(0);printf(Record in file d:w.dat:n);for(i=1;i5;i+=2)fseek(fp,i*sizeof(struct student),SEEK_SET);n=ftell(fp);fread(&a,sizeof(struct student),1,fp);printf(current:%ldth byte,%
27、dth record:%s%dn,n,i+1,a.name,a.num);fseek(fp,-3L*sizeof(struct student),2);n=ftell(fp);fread(&a,sizeof(struct student),1,fp);printf(current:%ldth byte,record is:%s%dn,n,a.name,a.num);rewind(fp);n=ftell(fp);fread(&a,sizeof(struct student),1,fp);printf(current:%ldth byte,first record:%s%dn“,n,a.name,
28、a.num);fseek(fp,-0L*sizeof(struct student),2);n=ftell(fp);printf(total bytes:%ldn,n);fclose(fp);【程序说明】fseek(fp,i*sizeof(struct student),SEEK_SET);fseek(fp,位移量位移量,起始位置起始位置)i*sizeof(struct student):从起始位置开始的位移量:从起始位置开始的位移量SEEK_SET:起始位置为文件头(:起始位置为文件头(0)SEEK_CUR:起始位置为文件当前位置(:起始位置为文件当前位置(1)SEEK_END:起始位置为文
29、件尾(:起始位置为文件尾(2)若要定位到第若要定位到第3条条记录,从文件头记录,从文件头开始定位,则位开始定位,则位移量是多少?移量是多少?fseek(fp,-3L*sizeof(struct student),2);将定位到哪条记录?将定位到哪条记录?【程序说明】n=ftell(fp);n:从文件起始位置至当前位置的字节数:从文件起始位置至当前位置的字节数若指针在第若指针在第2条记条记录处,录处,n为多少为多少?rewind(fp);n=ftell(fp);n为多少?为多少?-63-课堂总结课堂总结-64-作业布置作业布置1.我廖雪峰主编教材中的我廖雪峰主编教材中的第第96页程序填空题页程序
30、填空题第第1、2题题(直接写书上直接写书上)2.我廖雪峰主编教材中的我廖雪峰主编教材中的第第98页程序设计题页程序设计题第第1、2题请题请写写到作业本上;第到作业本上;第3题为题为选作题选作题3.上机运行我廖雪峰主编上机运行我廖雪峰主编教材第教材第92页页的调试的调试样例样例预习预习综合程序调试综合程序调试作业作业上机上机训练训练例例9.1例例9.4完成完成ftp:/10.172.250.252:1161下的下的“实验实验19-文件程序设计文件程序设计.doc”上机运行我廖雪峰主编教材第上机运行我廖雪峰主编教材第92页的调页的调试样例试样例上机实验(上机实验(第第19次实验次实验)谢谢 谢谢 观观 看看!