《C语言课件第10章 .ppt》由会员分享,可在线阅读,更多相关《C语言课件第10章 .ppt(26页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、北京信息科技大学计算中心北京信息科技大学计算中心章章 节节 目目 录录10.1 10.1 文件概念文件概念10.2 10.2 文件打开、关闭操作文件打开、关闭操作10.3 10.3 文件读、写操作文件读、写操作10.4 10.4 综合例题综合例题10.1文件的概念文件的概念定义定义分类分类一个有序的字符(或字节)流一个有序的字符(或字节)流 文本文件文本文件数据是以数据是以ASCII码字符形式存储的,每个字符占一个字节码字符形式存储的,每个字符占一个字节整型数据整型数据2500在文本文件中存储形式为在文本文件中存储形式为00110010001101010011000000110000 二进制文
2、件二进制文件数据以二数据以二进进制形式存制形式存储储整型数据整型数据2500在二在二进进制文件中存制文件中存储储形式形式为为0000100111000100 10.1文件的概念文件的概念10.1文件的概念文件的概念文件类型指针文件类型指针typedefstructintlevel;/缓冲区被占用的程度缓冲区被占用的程度unsignedflags;/文件状态标志文件状态标志charfd;/文件描述符文件描述符unsignedcharhold;/如无缓冲区,暂不读取字符如无缓冲区,暂不读取字符intbsize;/缓冲区的大小缓冲区的大小unsignedchar*buffer;/文件缓冲区指针文件缓
3、冲区指针unsignedchar*curp;/文件定位指针文件定位指针unsignedistemp;/暂时文件指示器暂时文件指示器shorttoken;/用于有效性检查用于有效性检查FILE;C系统函数库系统函数库“stdio.h”中定义了名为中定义了名为FILE的结构体类型,专门用于保存文件的该类信息的结构体类型,专门用于保存文件的该类信息10.1文件的概念文件的概念文文件件处处理理过过程程格式:格式:FILE*文件指针名;文件指针名;举例:举例:FILE*fp;定义了一个文件类型的指针变量定义了一个文件类型的指针变量打开文件操作打开文件操作对文件进行读对文件进行读/写操作写操作关闭文件操作
4、关闭文件操作10.2讲解讲解10.3讲解讲解10.2讲解讲解10.2文件打开关闭操作文件打开关闭操作文件打开操作文件打开操作定定义义FILE*fopen(char*filename,char*openmode)函数调用函数调用文件指针文件指针fopen(文件名,文件打开方式);文件名,文件打开方式);举举例例FILE*fp;/定义定义FILE类型的指针变量类型的指针变量fpif(fp=fopen(“d:tempfile1.txt”,“r”)=NULL)printf(“failtoopenfile.n”);/显示文件打开失败的提示信息显示文件打开失败的提示信息exit(0);/结束程序结束程序1
5、0.2文件打开关闭操作文件打开关闭操作文件打开方式文件打开方式10.2文件打开关闭操作文件打开关闭操作文件关闭操作文件关闭操作定定义义intfclose(FILE*fp)函数调用函数调用fclose(fp);说说明明通过通过fclose(fp)把指针把指针fp和文件和文件“脱钩脱钩”,从而关闭该文件,从而关闭该文件文件顺利关闭时,文件顺利关闭时,fclose函数返回值为函数返回值为0;否则返回值为;否则返回值为EOF(1)10.2文件打开关闭操作文件打开关闭操作文件打开关闭操作例题文件打开关闭操作例题例例10.1#includestdio.h#includestdlib.hintmain()F
6、ILE*fp;/定义定义FILE类型的指针变量类型的指针变量fpcharfilename30;gets(filename);/键盘输入文件名键盘输入文件名fp=fopen(filename,r);/只读方式打开文件只读方式打开文件if(fp=NULL)printf(failtoopenfile.n);/显示文件打开失败的提示信息显示文件打开失败的提示信息exit(0);/结束程序结束程序elseprintf(fileisopen.n);/显示文件打开成功的提示信息显示文件打开成功的提示信息fclose(fp);/关闭文件关闭文件return0;通过键盘输入文件名通过键盘输入文件名file1.t
7、xt,如果该文件打开成功请输出如果该文件打开成功请输出”fileisopen.”的提的提示信息,如果打开失败请输出示信息,如果打开失败请输出”failtoopenfile”的提示信息。的提示信息。10.3.1文件顺序读写文件顺序读写文件文件字符字符读写函数读写函数读操作读操作intfgetc(FILE*fp)函数调用举例:函数调用举例:ch=fgetc(fp);写操作写操作intfputc(charch,FILE*fp)函数调用举例:函数调用举例:fputc(ch,fp);fputc(a,fp);举举例例while(!feof(fp)ch=fgetc(fp);.10.3.1文件顺序读写文件顺序
8、读写文件字符读写函数例题文件字符读写函数例题例例10.2#includestdio.h#includestdlib.hintmain()FILE*fp;/定义定义FILE类型的指针变量类型的指针变量fpcharfilename30,ch;gets(filename);/键盘输入文件名键盘输入文件名fp=fopen(filename,w);/只写方式打开文件只写方式打开文件if(fp=NULL)printf(failtoopenfile.n);/显示文件打开失败的提示信息显示文件打开失败的提示信息exit(0);/结束程序结束程序elseprintf(“fileisopen.Pleaseinpu
9、tdata:n”);/提示文件已打开,请输字符串提示文件已打开,请输字符串while(ch=getchar()!=!)/输入字符串直至输入字符串直至!fputc(ch,fp);/向文件写入字符向文件写入字符fclose(fp);/关闭文件关闭文件return0;通过键盘输入若干字符直至输入通过键盘输入若干字符直至输入“!”为止,将其写入到新建文本文件为止,将其写入到新建文本文件file2.txtfile2.txt中中 10.3.1文件顺序读写文件顺序读写文件字符读写函数例题文件字符读写函数例题例例10.3#includestdlib.h#includestdio.hintmain()FILE*
10、fp;/定义定义FILE类型的指针变量类型的指针变量fpcharfilename30,ch;gets(filename);/键盘输入文件名键盘输入文件名fp=fopen(filename,r);/只读方式打开文件只读方式打开文件if(fp=NULL)printf(failtoopenfile.n);/显示文件打开失败的提示信息显示文件打开失败的提示信息exit(0);/结束程序结束程序elseprintf(fileisopen.Nowoutputdata:n);/提示文件已打开,将显示内容提示文件已打开,将显示内容while(!feof(fp)/判断文件是否结束判断文件是否结束ch=fgetc
11、(fp);/从文件读取字符并赋值给从文件读取字符并赋值给chputchar(ch);/在屏幕上输出文件内容在屏幕上输出文件内容fclose(fp);/关闭文件关闭文件return0;打开文件打开文件file2.txtfile2.txt,并将文件内容在屏幕上输出并将文件内容在屏幕上输出 10.3.1文件顺序读写文件顺序读写文件文件字符串字符串读写函数读写函数读操作读操作char*fgets(char*str,intn,FILE*fp)函数调用举例:函数调用举例:fgets(str,n,fp);写操作写操作intfputs(char*str,FILE*fp)函数调用举例:函数调用举例:fputs(
12、str,fp);举举例例fputs(str1,fp);fputs(n,fp);fputs(str2,fp);fputs(n,fp);如如str1=”hello,beijing”,str2=”ImChinese”,则运行该程序段后,文件中存储形式如下:则运行该程序段后,文件中存储形式如下:hello,beijingImChinese10.3.1文件顺序读写文件顺序读写文件字符串读写函数例题文件字符串读写函数例题例例10.4#includestdlib.h#includestdio.hintmain()FILE*fp;/定义定义FILE类型的指针变量类型的指针变量fpcharfilename30,
13、lesson530;inti;gets(filename);/键盘输入文件名键盘输入文件名fp=fopen(filename,w);/只写方式打开文件只写方式打开文件if(fp=NULL)printf(failtoopenfile.n);/显示文件打开失败的提示信息显示文件打开失败的提示信息exit(0);/结束程序结束程序elseprintf(fileisopen.Pleaseinputdata:n);/提示文件已打开,请输科目提示文件已打开,请输科目for(i=0;i5;i+)gets(lessoni);/读入科目名读入科目名fputs(lessoni,fp);/向文件中写入科目名向文件中
14、写入科目名fclose(fp);/关闭文件关闭文件return0;通过键盘输入五门考试科目,并存储到文本文件通过键盘输入五门考试科目,并存储到文本文件file4.txtfile4.txt中中 10.3.1文件顺序读写文件顺序读写文件字符串读写函数例题文件字符串读写函数例题例例10.5#includestdlib.h#includestdio.h#includestring.hintmain()FILE*fp;/定义定义FILE类型的指针变量类型的指针变量fpcharfilename30,lesson530;inti=0;gets(filename);/键盘输入文件名键盘输入文件名fp=fope
15、n(filename,r);/只读方式打开文件只读方式打开文件if(fp=NULL)printf(failtoopenfile.n);/显示文件打开失败的提示信息显示文件打开失败的提示信息exit(0);/结束程序结束程序elseprintf(fileisopen.Nowoutputdata:n);/提示文件已打开,将显示内容提示文件已打开,将显示内容while(fgets(lessoni,30,fp)!=NULL)/判断文件是否结束判断文件是否结束printf(t%s,lessoni);/在屏幕上输出科目内容在屏幕上输出科目内容i+;/科目的个数科目的个数printf(“Thereare%d
16、lessons.n”,i);/输出考试科目的个数输出考试科目的个数fclose(fp);/关闭文件关闭文件return0;将文本文件将文本文件file4.txtfile4.txt中考试科目的名称及个数输出到屏幕上中考试科目的名称及个数输出到屏幕上 10.3.1文件顺序读写文件顺序读写文件文件格式化格式化读写函数读写函数读操作读操作intfscanf(FILE*fp,“输入格式描述串输入格式描述串”,输入项地址表输入项地址表列列)写操作写操作intfpintf(FILE*fp,“输出格式描述串输出格式描述串”,输出项地址表列输出项地址表列)举举例例fscanf(fp,“%s%d”,str,&sc
17、o);fprintf(fp,“%s%d”,str,sco);10.3.1文件顺序读写文件顺序读写文件格式化读写函数例题文件格式化读写函数例题例例10.6#includestdlib.h#includestdio.h#includestring.hintmain()FILE*fp;/定义定义FILE类型的指针变量类型的指针变量fpcharfilename30,lesson530;inti=0;gets(filename);/键盘输入文件名键盘输入文件名fp=fopen(filename,r);/只读方式打开文件只读方式打开文件if(fp=NULL)printf(failtoopenfile.n)
18、;/显示文件打开失败的提示信息显示文件打开失败的提示信息exit(0);/结束程序结束程序elseprintf(fileisopen.Nowoutputdata:n);/提示文件已打开,将显示内容提示文件已打开,将显示内容for(i=0;!feof(fp);i+)/判断文件是否结束判断文件是否结束fscanf(fp,%s,lessoni);printf(“%sn”,lessoni);/在屏幕上输出科目内容在屏幕上输出科目内容printf(“Thereare%dlessons.n”,i);/输出考试科目的个数输出考试科目的个数fclose(fp);/关闭文件关闭文件return0;调用调用fsc
19、anffscanf函数将文本文件函数将文本文件file4.txtfile4.txt中考试科目的名称及个数输出到屏幕上中考试科目的名称及个数输出到屏幕上 10.3.1文件顺序读写文件顺序读写二进制数据块读写函数二进制数据块读写函数读操作读操作intfread(void*buffer,unsignedsize,unsignedcount,FILE*fp)写操作写操作intfwrite(void*buffer,unsignedsize,unsignedcount,FILE*fp)举举例例fread(array,sizeof(float),5,fp);fwrite(array,sizeof(float
20、),5,fp);10.3.1文件顺序读写文件顺序读写二进制数据块读写函数例题二进制数据块读写函数例题例例10.7#defineNUM5structlessonchartestname15;/科目名称科目名称floattestscore;/科目分数科目分数intmain()FILE*fp;lessonscoreNUM,*p=score;inti;if(fp=fopen(score.dat,wb)=NULL)/只写方式打开二进制文件只写方式打开二进制文件printf(failtoopenfile.n);/显示文件打开失败的提示信息显示文件打开失败的提示信息exit(0);/结束程序结束程序else
21、printf(pleaseinput%dlessonsnameandscore.n,NUM);for(i=0;iNUM;i+,p+)printf(input%dtestname:n,i+1);scanf(%s,scorei.testname);/5次键盘读入名称和分数次键盘读入名称和分数printf(input%dtestscore:n,i+1);scanf(“%f”,&scorei.testscore);/5次键盘读入名称和分数次键盘读入名称和分数fwrite(p,sizeof(structlesson),1,fp);/fwrite函函数数写写入入文文件件printf(endinginput
22、n);/提示输入结束提示输入结束fclose(fp);/关闭文件关闭文件return0;通过键盘输入学生张磊的五门考试科目的名称和分数,并存储到文件通过键盘输入学生张磊的五门考试科目的名称和分数,并存储到文件score.score.datdat中中 10.3.1文件顺序读写文件顺序读写二进制数据块读写函数例题二进制数据块读写函数例题例例10.8#defineNUM5structlessonchartestname15;/科目名称科目名称floattestscore;/科目分数科目分数intmain()FILE*fp;lessonscoreNUM,*p=score;inti;if(fp=fope
23、n(score.dat,rb)=NULL)/只读方式打开二进制文件只读方式打开二进制文件printf(failtoopenfile.n);/显示文件打开失败的提示信息显示文件打开失败的提示信息exit(0);/结束程序结束程序elseprintf(fileisopen,nowshow%dlessonsnameandscore.n,NUM);fread(p,sizeof(structlesson),NUM,fp);/freaad函数读取文件函数读取文件for(i=0;iNUM;i+)printf(%stt%.2fn,scorei.testname,scorei.testscore);/输出科目名
24、称和分数输出科目名称和分数fclose(fp);/关闭文件关闭文件return0;读取文件读取文件score.score.datdat中学生张磊的五门考试科目的名称和分数,并输出到屏幕中学生张磊的五门考试科目的名称和分数,并输出到屏幕 10.3.2文件随机读写文件随机读写重定位重定位rewind函数函数定定义义voidrewind(FILE*fp)举举例例rewind(fp);说说明明将当前文件读将当前文件读/写位置指针重新指向文件开始处写位置指针重新指向文件开始处10.3.2文件随机读写文件随机读写重定位函数例题重定位函数例题例例10.9#includestdio.h#includestdl
25、ib.hintmain()FILE*file1,*newfile;if(file1=fopen(file1.txt,r)=NULL)/只读方式打开只读方式打开file1.txtprintf(failtoopenfile1.txt.n);/显示文件打开失败的提示信息显示文件打开失败的提示信息exit(0);/结束程序结束程序if(newfile=fopen(newfile.txt,w+)=NULL)/读写方式打开读写方式打开newfile.txtprintf(failtoopennewfile.txt.n);/显显示示文文件件打打开开失失败败的的提提示示信信息息exit(0);/结束程序结束程序
26、while(!feof(file1)/判断文件是否结束判断文件是否结束fputc(fgetc(file1),newfile);/复制文件复制文件rewind(newfile);/重定位重定位while(!feof(newfile)putchar(fgetc(newfile);/输出文件输出文件newfile.txt内容内容fclose(file1);fclose(newfile);return0;文件文件file1.txtfile1.txt中内容复制到新建文件中内容复制到新建文件newfilenewfile.txt.txt中,并将中,并将newfilenewfile.txt.txt内容屏幕输出
27、内容屏幕输出 10.3.2文件随机读写文件随机读写文件定位文件定位fseek函数函数定定义义intfseek(FILE*fp,longoffset,intposition)举举例例fseek(fp,5,0);/将指针从文件头往后移动将指针从文件头往后移动5个字节个字节fseek(fp,-2,SEEK_CUR);/将指针从当前读将指针从当前读/写位置往前移动写位置往前移动2个字节个字节说说明明将当前读将当前读/写位置指针相对于文件头写位置指针相对于文件头/当前位置当前位置/文件尾移动指定个字节文件尾移动指定个字节offset表示移动字节的个数表示移动字节的个数position表示参照位置,有三种
28、取值:表示参照位置,有三种取值:0或或SEEK_SET,表示文件头位置;表示文件头位置;1或或SEEK_CUR表示文件当前读表示文件当前读/写位置;写位置;2或或SEEK_END表示文件尾。表示文件尾。10.3.2文件随机读写文件随机读写定位函数例题定位函数例题例例10.10intmain()FILE*fp;lessonscoreNUM,*p,t,a;inti;scanf(%s,a.testname);/输入需要修改的科目名称输入需要修改的科目名称scanf(%f,&a.testscore);if(fp=fopen(score.dat,rb+)=NULL)/只读方式打开二进制文件只读方式打开二
29、进制文件printf(failtoopenfile.n);/显示文件打开失败的提示信息显示文件打开失败的提示信息exit(0);/结束程序结束程序elseprintf(fileisopen,nowshow%dlessonsnameandscore.n,NUM);while(fread(&t,sizeof(structlesson),1,fp)!=NULL)/freaad函数读取文件函数读取文件if(strcmp(a.testname,t.testname)=0)/科目名称进行匹配科目名称进行匹配printf(findtherecord.n);fseek(fp,-sizeof(structles
30、son),1);/调整当前读调整当前读/写位置指针写位置指针fwrite(&a,sizeof(structlesson),1,fp);/新数据写入文件新数据写入文件break;rewind(fp);/指针重新定位至文件头指针重新定位至文件头while(fread(&t,sizeof(structlesson),1,fp)!=NULL)printf(%st%.2fn,t.testname,t.testscore);fclose(fp);return0;文件文件score.score.datdat已保存了学生张磊已保存了学生张磊5 5门考试科目的名称和分数,通过键盘输入需要修改的门考试科目的名称和
31、分数,通过键盘输入需要修改的科目名称和分数,将更新分数写入到文件中,并将文件更新后的内容在屏幕输出科目名称和分数,将更新分数写入到文件中,并将文件更新后的内容在屏幕输出 10.3.2文件随机读写文件随机读写位置位置ftell函数函数定定义义longftell(FILE*fp)举举例例printf(“ftellis%dn”,ftell(fp);说说明明获取当前读获取当前读/写位置指针相对于文件头的位移量写位置指针相对于文件头的位移量10.4综合举例综合举例例例10.11新建一个文件新建一个文件student.dat,并通过编程完成如下功能:并通过编程完成如下功能:1)通过键盘输入通过键盘输入10个学生的学号、姓名、专业、分数,并存入文件中;个学生的学号、姓名、专业、分数,并存入文件中;2)读取文件,并在屏幕上输出学生的所有信息;读取文件,并在屏幕上输出学生的所有信息;3)输入学号,可查询指定学生的信息;输入学号,可查询指定学生的信息;4)输入专业,可查询相关学生的信息;输入专业,可查询相关学生的信息;5)向文件中添加新的学生的信息;向文件中添加新的学生的信息;6)输入学号,删除指定学生的信息;输入学号,删除指定学生的信息;7)输入学号,修改指定学生的分数信息。输入学号,修改指定学生的分数信息。设计菜单界面,将如上功能显示在总界面。设计菜单界面,将如上功能显示在总界面。
限制150内