C语言课件第13章文件

PPT
  • 阅读 57 次
  • 下载 0 次
  • 页数 44 页
  • 大小 312.535 KB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
C语言课件第13章文件
可在后台配置第一页与第二页中间广告代码
C语言课件第13章文件
可在后台配置第二页与第三页中间广告代码
C语言课件第13章文件
可在后台配置第三页与第四页中间广告代码
C语言课件第13章文件
C语言课件第13章文件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 44
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
文本内容

【文档说明】C语言课件第13章文件.ppt,共(44)页,312.535 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-44591.html

以下为本文档部分文字说明:

第十三章本章要点文件的基本概念文件的基本函数文件的顺序读写文件的随机读写文件简单应用主要内容13.1C文件概述13.2文件类型指针13.3文件的打开与关闭13.4文件的读写13.5文件的定位13.6出错的检测13.7文件输入输出小结§13.1C文件概述文件的定义所谓文件

一般指存储在外部介质(如磁盘磁带)上数据的集合.操作系统是以文件为单位对数据进行管理的.文件程序数据区输出文件缓冲区输入文件缓冲区§13.1C文件概述(续)文件的分类•从用户观点:特殊文件(标准输入输出文件或标准设备文件)普通文件(磁盘文件)从操作系统

的角度看,每一个与主机相连的输入输出设备看作是一个文件。例:输入文件:终端键盘输出文件:显示屏和打印机文件的分类•按数据的组织形式:ASCII文件(文本文件):每一个字节放一个ASCII代码二进制文件:把内存中的数据

按其在内存中的存储形式原样输出到磁盘上存放.例:整数10000在内存中的存储形式以及分别按ASCII码形式和二进制形式输出如下图所示:§13.1C文件概述(续)§13.1C文件概述(续)文件的分类ASCII文

件和二进制文件的比较:ASCII文件便于对字符进行逐个处理,也便于输出字符。但一般占存储空间较多,而且要花费转换时间。二进制文件可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。一般中间结果数据需要暂时保存在外存上,以后又

需要输入内存的,常用二进制文件保存。§13.1C文件概述(续)文件的分类•C语言对文件的处理方法:缓冲文件系统:系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。用缓冲文件系统进行的输入输出又称为高级磁盘输入输出。非缓冲文件系统:

系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。用非缓冲文件系统进行的输入输出又称为低级输入输出系统。§13.1C文件概述(续)说明:在UNIX系统下,用缓冲文件系统来处理文本文件,用非缓冲文件系统来处理二进制文件.ANSIC标准只采用缓冲文件系统来处理文本文件和二进制文件.C语

言中对文件的读写都是用库函数来实现.§13.2文件类型指针TurboC在stdio.h文件中有以下的文件类型声明:typedefstruct{shortlevel;/*缓冲区“满”或“空”的程度*/unsignedflags;/*文件

状态标志*/charfd;/*文件描述符*/unsignedcharhold;/*如无缓冲区不读取字符*/shortbsize;/*缓冲区的大小*/unsignedchar*buffer;/*数据缓冲区的位置*/unsignedchar*curp;/*

指针,当前的指向*/unsignedistemp;/*临时文件,指示器*/shorttoken;/*用于有效性检查*/}FILE;在缓冲文件系统中,每个被使用的文件都要在内存中开辟一FILE类型的区,存放文件的有关信息.§13.2文件类型指针(续)FIL

E类型的数组:FILEf[5];定义了一个结构体数组f,它有5个元素,可以用来存放5个文件的信息。文件型指针变量:FILE*fp;fp是一个指向FILE类型结构体的指针变量。可以使fp指向某一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件。如果有n个文件,一般应设n个

指针变量,使它们分别指向n个文件,以实现对文件的访问。§13.3文件的打开与关闭一.文件的打开(fopen函数)函数调用:FILE*fp;fp=fopen(文件名,使用文件方式);①需要打开的文件名,也就是准备访问的文件的名字;②使用文件的方式(“读”还是“写”等

);③让哪一个指针变量指向被打开的文件。§13.3文件的打开与关闭(续)文件使用方式含义“r”(只读)为输入打开一个文本文件“w”(只写)为输出打开一个文本文件“a”(追加)向文本文件尾增加数据“rb”(只读)为输入打开一个二进制文件“wb”(只写)为输出打开一个二进制文件"ab“(追加)

向二进制文件尾增加数据"r+“(读写)为读/写打开一个文本文件"w+”(读写)为读/写建立一个新的文本文件"a+”(读写)为读/写打开一个文本文件"rb+“(读写)为读/写打开一个二进制文件“wb+“(读写

)为读/写建立一个新的二进制文件“ab+”(读写)为读/写打开一个二进制文件§13.3文件的打开与关闭(续)二.文件的关闭(fclose函数)函数调用:fclose(文件指针);函数功能:使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不

能再通过该指针对原来与其相联系的文件进行读写操作返回值:关闭成功返回值为0;否则返回EOF(-1)§13.4文件的读写一.字符输入输出函数(fputc()和fgetc())fputc函数函数调用:fputc(ch,fp);函数功能:将字符(ch的值)输出到fp所指向的

文件中去。返回值:如果输出成功,则返回值就是输出的字符;如果输出失败,则返回一个EOF.§13.4文件的读写(续)fgetc函数函数调用:ch=fgetc(fp);函数功能:从指定的文件读入一个字符,该文件

必须是以读或读写方式打开的。返回值:读取成功一个字符,赋给ch。如果遇到文件结束符,返回一个文件结束标志EOF,即-1。§13.4文件的读写(续)常见的读取字符操作从一个文本文件顺序读入字符并在屏幕上显示出来:ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch

=fgetc(fp);}注意:EOF不是可输出字符,因此不能在屏幕上显示。由于字符的ASCII码不可能出现-1,因此EOF定义为-1是合适的。当读入的字符值等于-1时,表示读入的已不是正常的字符而是文件结束符。§13.4文件的读写(续)常见的读取字符操作从一个二进制文件顺序

读入字符:while(!feof(fp)){ch=fgetc(fp);}注意:ANSIC提供一个feof()函数来判断文件是否真的结束。如果是文件结束,函数feof(fp)的值为1(真);否则为0(假)。以上也适用于文本文件的读取。§13.4文件的读写(续

)fputc和fgetc函数使用举例:例13.1从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个“#”为止。#include<stdlib.h>#include<stdio.h>voidmain(v

oid){FILE*fp;charch,filename[10];scanf("%s",filename);if((fp=fopen(filename,"w"))==NULL){printf("cannotopenfile\n");exit(0);/*终止程序

*/}ch=getchar();/*接收执行scanf语句时最后输入的回车符*/ch=getchar();/*接收输入的第一个字符*/while(ch!='#'{fputc(ch,fp);putchar(c

h);ch=getchar();}fclose(fp);}运行情况如下:(输入磁盘文件名)computerandcomputerandc(输出一个字符串)§13.4文件的读写(续)fputc和fgetc函数使用举例:例13.2将

一个磁盘文件中的信息复制到另一个磁盘文件中。#include<stdlib.h>#include<stdio.h>main(){FILE*in,*out;charch,infile[10],outfile[10];printf("Enterthei

nfilename:\n");scanf("%s",infile);printf("Entertheoutfilename:\n");scanf("%s",outfile);if((in=fopen(infile,"r")

)==NULL){printf("cannotopeninfile\n");exit(0);}if((out=fopen(outfile,"w"))==NULL){printf("cannotopenoutfil

e\n");exit(0);}while(!feof(in))fputc(fgetc(in),out);fclose(in);fclose(out);}运行情况如下:EntertheinfilenameEntertheoutfilename:(输入新复制的磁盘文

件名)程序运行结果是将file1.c文件中的内容复制到file2.c中去。§13.4文件的读写(续)fputc和fgetc函数使用举例:例13.2的改进:复制一个二进制文件,利用main参数,在输入命令行是将两个文件

名输入。#include<stdlib.h>#include<stdio.h>main(intargc,char*argv[]){FILE*in,*out;charch;if(argc!=3){printf(

"Youforgottoenterafilename\n");exit(0);}if((in=fopen(argv[1],"rb"))==NULL){printf("cannotopeninfile\n");exit(0);}if((out=fopen

(argv[2],"wb"))==NULL){printf("cannotopenoutfile\n");exit(0);}while(!feof(in))fputc(fgetc(in),out);fclos

e(in);fclose(out);}运行方法:设经编译连接后得到的可执行文件名为a.exe,则在DOS命令工作方式下,可以输入以下的命令行:C>afile1.cfile2.cfile1.c和file2.c,分别输入到argv[1]和argv[2]中,argv[0]的内容为a,argc的值等于

3。§13.4文件的读写(续)二.数据块读写函数(fread()和fwrite())函数调用:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);参数说明:buffer:是一个指针。对fread来说,它是读入数据的

存放地址。对fwrite来说,是要输出数据的地址(均指起始地址)。size:要读写的字节数。count:要进行读写多少个size字节的数据项。fp:文件型指针。函数调用成功则返回值为count。§13.4文件的读写(续)使用举例:若文件以二进制形式

打开:fread(f,4,2,fp);此函数从fp所指向的文件中读入2个4个字节的数据,存储到数组f中。§13.4文件的读写(续)使用举例:若有如下结构类型:structstudent_type{charname[1

0];intnum;intage;charaddr[30];}stud[40];可以用fread和fwrite来进行数据的操作:for(i=0;i<40;i++)fread(&stud[i],sizeof(structstude

nt_type),1,fp);for(i=0;i<40,i++)fwrite(&stud[i],sizeof(structstudent_type),1,fp);§13.4文件的读写(续)使用举例:例13.3从键盘输入4个学生的有关数据,然后把它们转存到磁盘文件上去。#include<stdio

.h>#defineSIZE4structstudent_type{charname[10];intnum;intage;charaddr[15];}stud[SIZE];/*定义结构*/§13.4文件的读写(续)voidsave(){FILE*fp;inti;if((fp=fopen(

"stu_list","wb"))==NULL){printf("cannotopenfile\n");return;}for(i=0;i<SIZE;i++)/*二进制写*/if(fwrite(&st

ud[i],sizeof(structstudent_type),1,fp)!=1)printf(“filewriteerror\n”);/*出错处理*/fclose(fp);}/*关闭文件*/main(){inti;for(i

=0;i<SIZE;i++)/*从键盘读入学生信息*/scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);save();}/*调用save()保存学生信息*/运行情况如下

:输入4个学生的姓名、学号、年龄和地址:Zhang100119room-Fun100220room-Tan100321room-Ling100421room-验证在磁盘文件“stu-list”中是否已存在此数据,用以下程序从“stu-list”文件中读入数据,然后在屏幕

上输出。§13.4文件的读写(续)#include<stdio.h>#defineSIZE4structstudent_type{charname[10];intnum;intage;charaddr[15];}stud[SIZE];main(){inti;FILE*fp;fp=fopen(

"stu-list","rb");for(i=0;i<SIZE;i++){fread(&stud[i],sizeof(structstudent_type),1,fp);printf("%\-10s%4d%4d%\-15s\n",stud[i

].name,stud[i].num,stud[i].age,stud[i].addr);}fclose(fp);}屏幕上显示出以下信息:Zhang100119room-101Fun100220room-102Tan100321room-103Ling100

421room-104如果已有的数据已经以二进制形式存储在一个磁盘文件“stu_dat”中,要求从其中读入数据并输出到“stu_list”文件中,可以编写一个load函数,从磁盘文件中读二进制数据。§13.4文件的读写

(续)voidload(){FILE*fp;inti;if((fp=fopen("stu_dat","rb"))==NULL){printf("cannotopeninfile\n");return;}for(i=0;i<SIZE;i++)if(fread(&stud[i],

sizeof(structstudent_type),1,fp)!=1){if(feof(fp)){fclose(fp);return;}printf("filereaderror\n");}fclose

(fp);}§13.4文件的读写(续)三.格式化读写函数(fprintf()和fscanf())函数调用:fprintf(文件指针,格式字符串,输出表列);fscanf(文件指针,格式字符串,输入表列);函数功能:

从磁盘文件中读入或输出字符。例:fprintf(fp,”%d,%6.2f”,i,t);fscanf(fp,”%d,%f”,&i,&t);注意:用fprintf和fscanf函数对磁盘文件读写,使用方便

,容易理解,但由于在输入时要将ASCII码转换为二进制形式,在输出时又要将二进制形式转换成字符,花费时间比较多。因此,在内存与磁盘频繁交换数据的情况下,最好不用fprintf和fscanf函数,而用fread和fwrite函数

。§13.4文件的读写(续)三.其他读写函数putw()和getw()函数调用:putw(inti,FILE*fp);inti=getw(FILE*fp);函数功能:对磁盘文件中读写一个字(整数)。例:putw(10,fp);i=getw(fp);putw

函数定义如下:putw(intI,FILE*fp){chars;s=&I;putc(s[0],fp);putc(s[1],fp);returni;}gutw函数定义如下:gutw(FILE*fp){chars;s=char*&i;s[0]=ge

tc(fp);s[1]=getc(fp);returni;}§13.4文件的读写(续)用户自定义读取其他类型数据的函数向磁盘文件写一个实数(用二进制方式)的函数putfloat:putfloat(floatnum,FILE*fp){char

*s;intcount;s=(char*)&num;for(count=0;count<4;count++)fputc(s[count],fp);}§13.4文件的读写(续)fgets函数函数作用:从指定文件读入一个字符串。函数调用

:fgets(str,n,fp);从fp指向的文件输入n-1个字符,在最后加一个’\0’返回值:str的首地址§13.4文件的读写(续)fputs函数函数作用:向指定的文件输出一个字符串。函数调用:fputs(“china”,fp);第一个参数可以是字符串常量、字符数组名或字符

型指针。字符串末尾的′\0′不输出。返回值:输出成功,返回值为0;输出失败,返回EOF.§13.5文件的定位rewind函数函数作用:使位置指针重新返回文件的开头,无返回值。应用举例:例13.4有一个

磁盘文件,第一次将它的内容显示在屏幕上,第二次把它复制到另一文件上。#include<stdio.h>main(){FILE*fp1,*fp2;fp1=fopen("file1.c","r");fp2=fopen("file2.c","w")

;while(!feof(fp1))putchar(fgetc(fp1));rewind(fp1);while(!feof(fp1))fputc(fgetc(fp1),fp2);fclose(fp1);fc

lose(fp2);}§13.5文件的定位顺序读写和随机读写顺序读写:位置指针按字节位置顺序移动。随机读写:读写完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读些文件中任意位置上所需要的字符(字节)。§13.5文件的定位fseek函数(

一般用于二进制文件)函数功能:改变文件的位置指针函数调用形式:fseek(文件类型指针,位移量,起始点)起始点:文件开头SEEK_SET0文件当前位置SEEK_CUR1文件末尾SEEK_END2位移量:以起始点为基点,向前移动的字节数。一般要

求为long型§13.5文件的定位fseek函数应用举例fseek(fp,100L,0);将位置指针移到离文件头100个字节处fseek(fp,50L,1);将位置指针移到离当前位置50个字节处fseek(fp,50

L,2);将位置指针从文件末尾处向后退10个字节§13.5文件的定位例13.5在磁盘文件上存有10个学生的数据。要求将第1、3、5、7、9个学生数据输入计算机,并在屏幕上显示出来。#include<stdlib.h>#include<stdio.h>

structstudent_type{charname[10];intnum;intage;charsex;}stud[10];main(){inti;FILE*fp;if((fp=fopen(“stud_dat","rb"))==NULL){print

f("cannotopenfile\n");exit(0);}for(i=0;i<10;i+=2){fseek(fp,i*sizeof(structstudent_type),0);fread(&stud[i],sizeo

f(structstudent_type),1,fp);printf(“%s%d%d%c\n”,stud[i].name,stud[i].num,stud[i].age,stud[i].sex);}fclose(fp)}§13.5文件

的定位ftell函数函数作用:得到流式文件中的当前位置,用相对于文件开头的位移量来表示。返回值:返回当前位置,出错时返回-1L。应用举例:i=ftell(fp);if(i==-1L)printf(“error\n

”);§13.6出错的检测ferror函数调用形式:ferror(fp);返回值:返回0,表示未出错;返回非0,表示出错。在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动置为0。§13.6出错的检测clearerr函数调用形

式:clearerr(fp);函数作用:使文件错误标志和文件结束标志置为0。只要出现错误标志,就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数。§13.7文件输入输出小结分类函

数名功能打开文件fopen()打开文件关闭文件fclose()关闭文件文件定位fseek()改变文件位置指针的位置rewind()使文件位置指针重新至于文件开头ftell()返回文件位置指针的当前值文件状态feof()若到文件末尾,函数值为真ferror()若对文件

操作出错,函数值为真clearerr()使ferror和feof()函数值置零§13.7文件输入输出小结分类函数名功能文件读写fgetc(),getc()从指定文件取得一个字符fputc(),putc()把字符输出到指定文件fgets()从指定文件读取字符串fpu

ts()把字符串输出到指定文件getw()从指定文件读取一个字(int型)putw()把一个字输出到指定文件fread()从指定文件中读取数据项fwrite()把数据项写到指定文件中fscanf()从指定文件按格式输入数据fprintf()按指定格式将数据写到指定文件中1、C文件有何特点?

2、文件打开和关闭的含义是什么?为什么要打开和关闭文件?思考题作业教材P348习题13.4、13.6、13.8、13.10

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?