C程序设计文件.ppt

上传人:b****1 文档编号:1368842 上传时间:2022-10-21 格式:PPT 页数:20 大小:145KB
下载 相关 举报
C程序设计文件.ppt_第1页
第1页 / 共20页
C程序设计文件.ppt_第2页
第2页 / 共20页
C程序设计文件.ppt_第3页
第3页 / 共20页
C程序设计文件.ppt_第4页
第4页 / 共20页
C程序设计文件.ppt_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

C程序设计文件.ppt

《C程序设计文件.ppt》由会员分享,可在线阅读,更多相关《C程序设计文件.ppt(20页珍藏版)》请在冰豆网上搜索。

C程序设计文件.ppt

9文件,2,文件系统,缓冲型文件系统:

系统自动在内存中为每个文件开辟一个缓冲区,作为程序和磁盘文件数据交流的中间媒介.,三步中的每一步都是通过C语言的库函数实现,3,与文件输入输出相关的库函数,#include打开:

fopen();读写:

fgetc();fputc();fgets();fputs();fread();fwrite();fscanf();fprintf();文件定位指针rewind();fseek();ftell();feof();关闭:

fclose();,法宝:

每个库函数在调用时可以查询。

TC:

CTRL+F1VC输入函数名即可看到函数形参。

4,要解决的问题1:

将学生信息存入文件,再从文件调入数组,#include#defineN30structstucharname10;intnum;intage;charaddr15;,5,1、输入学生信息存入数组,voidmain()structstuboyaN,boybN,*pp,*qq;FILE*fp;/*定义一个用于指向FILE类型的指针fp*/inti;printf(ninputdatan);for(i=0,pp=boya;iname,FILE类型是在stdio.h文件中定义的。

typedefstructintlevel;/*缓冲区满或空的程度*/unsignedflags;/*文件状态标志*/charfd;/*文件描述符*/unsignedcharhold;/*如无缓冲区不读字符*/shortbsize;/*缓冲区的大小*/unsignedchar*buffer;/*数据缓冲区的位置*/unsignedchar*curp;/*文件定位指针*/unsignedistemp;/*临时文件指示器*/shorttoken;/*用于有效性检查*/FILE;,6,2、存入文件(打开文件-存储-关闭文件),/*先要打开文件*/if(fp=fopen(stu_list.dat,wb+)=NULL)printf(Cannotopenfilestrikeanykeyexit!

);exit

(1);,FILE*fopen(char*filename,char*type);例:

FILE*fp=fopen(C:

CONFIG.SYS,rw);filename是文件名包含路径。

如果不含路径,表示打开当前目录下的文件type是打开方式常用为r、w、rw和a,分别表示只读、只写、读写和添加“b”表示二进制文件,不写“b”表示文本文件返回值为指向此文件的指针,留待以后使用如果打开失败,返回值为NULL,inta=30000;ASCII码文件中存储格式:

3,0,0,0,0,(5个字节)二进制文件中存储格式:

30000的补码(2个字节),即1110101001100000,二者各有特点:

ASCII文件浪费空间和时间,直观二进制文件节省空间和时间,不直观,7,2、存入文件(打开文件-存储-关闭文件),/*存入文件(输出到文件)*/for(i=0,pp=boya;iname,pp-num,pp-age,pp-addr);如果存储的全部是字符类型,也可以用fwrite(pp,sizeof(structstu),1,fp);,intfprintf(FILE*fp,char*format,arg1,argn)函数功能:

按照format给出的控制符格式,将变元arg1,argn的值写入到fp所指向的文件中去。

unsignedfwrite(void*ptr,unsignedsize,unsignednumb,FILE*fp);函数功能:

把从ptr开始的numb个size大小的数据块写入fp指向的文件,函数调用成功返回count的值,否则返回-1。

当写一个字符或一个字符串时,可用fputc()和fputs().,intfputc(intc,FILE*fp);功能:

向fp输出字符c若写入错误,则返回EOF,否则返回c例:

fputc(a,fp);/*将字符a写到fp指向的文件*/,intfputs(char*s,FILE*fp);功能:

将字符串写到fp指向的文件中去成功时返回0,出错时返回EOF例:

fputs(“abcde”,fp);/*将字符串写到fp指向的文件*/,8,2、存入文件(打开文件-存储-关闭文件),/*最后关闭文件*/fclose(fp);,intfclose(FILE*fp);函数功能:

关闭文件,此时,fp不再指向文件在内存的缓冲区。

返回值:

关闭成功时返回值为0。

否则(如磁盘空间不足、写保护或关闭已经关闭的文件)返回EOF,即-1。

9,3、从文件读入到数组(打开文件-读入到数组-关闭文件),if(fp=fopen(stu_list.dat,rb)=NULL)printf(Cannotopenfilestrikeanykeyexit!

);exit

(2);for(i=0;iname,输出到stdout文件,即输出到屏幕。

其实,从键盘输入、输出到屏幕与报错都是以文件的形式来存储信息,这三个标准设备文件分别是stdin,stdout,stderr从用户角度对文件分类,可分为两类:

标准设备文件和普通磁盘文件,10,要解决的问题2:

复制文件,输入两个文件名打开这两个文件将一个文件的内容复制到另外一个文件中关闭这两个文件,11,#include#includevoidmain()FILE*fp1,*fp2;charch,file130,file230;printf(Inputsourcefile:

);scanf(%s,file1);/*输入源文件名*/printf(Inputobjectfile:

);scanf(%s,file2);/*输入目的文件名*/if(fp1=fopen(file1,r)=NULL)printf(Cannotopen%sn,file1);exit

(1);/*打开源文件*/if(fp2=fopen(file2,w)=NULL)fp2=stdout;/*打开目的文件,找不到的话输出到屏幕*/*从源文件中读一个字符,并写入目的文件中*/while(ch=fgetc(fp1)!

=EOF)fputc(ch,fp2);fclose(fp1);/*关闭两个文件*/fclose(fp2);,12,/*copy.c*/#include#includevoidmain(intargc,char*argv)FILE*fp1,*fp2;charch;if(argc!

=3)puts(errorinparameters!

);exit(0);if(fp1=fopen(argv1,r)=NULL)printf(Cannotopen%sn,argv1);exit

(1);/*打开源文件*/if(fp2=fopen(argv2,w)=NULL)fp2=stdout;/*打开目的文件,找不到的话输出到屏幕*/*从源文件中读一个字符,并写入目的文件中*/while(ch=fgetc(fp1)!

=EOF)fputc(ch,fp2);fclose(fp1);/*关闭两个文件*/fclose(fp2);,/*该程序编译后,要在dos命令行下输入3个参数方能运行,第一个是该程序的名字copy,第二个是源文件名,第三个是目的文件名。

整个程序的功能是实现文件复制*/,13,如何随机读写文件的某一部分?

前边对文件的读写都是从头开始,按顺序读(写)。

如何只读写文件的某一部分呢?

除有FILE*类型的指针fp指向文件的开始外,还有一个char*类型的文件定位指针curp,指向文件内部下一个要读(写)的字符。

我们可以通过改变curp的位置实现随机读写。

14,几个相关函数,voidrewind(FILE*fp);功能:

让fp中的文件定位指针指向文件开始位置intfseek(FILE*fp,longoffset,intfromwhere);功能:

把fp中的文件定位指针移动到相应位置fromwhere:

SEEK_SET或0-文件开始SEEK_CUR或1-当前位置SEEK_END或2-文件末尾longftell(FILE*fp);功能:

返回fp中文件定位指针所在的位置intfeof(FILE*fp);功能:

当文件位置指针指向fp末尾时,返回非0值,否则返回0例:

while(feof(fp)=0)c=fgetc(fp);,15,#includestructstucharname10;intnum;intage;charaddr15;boy,*qq=,例3,16,例4:

程序结构:

floatFun1(floatx)/*函数1定义*/floatFun2(floatx)/*函数2定义*/floatIntegral(float(*f)(float),floata,floatb)/*求积分函数定义*/voidmain()y1=Integral(Fun1,a,b);/*对函数1求积分*/y2=Integral(Fun2,a,b);/*对函数2求积分*/,实参是函数名,形参是指向函数的指针其实,函数名也就是函数在内存中的首地址.指向函数的指针定义为:

int(*p)();/*定义一个变量p,是用来指向返回值为int的函数的*/指针的初始化为:

p=max;/*f指向fun1*/函数调用时,可采用如下方式:

max(a,b);P(a,b);(*p)(a,b);!

(*max)(a,b)与p(a,b)不行,17,函数指针变量作函数参数,/*函数功能:

求函数f在a,b的积分*/floatIntegral(float(*f)(),floata,floatb)floats,h,y;intn,i;s=(*f)(a)+(*f)(b)/2.0;n=100;h=(b-a)/n;for(i=0;in;i+)y=a+i*h;s+=(*f)(y);returns*h;,18,小结,文件的相关概念及相关库函数的调用带参数的main()指向函数的指针,19,重点,循环“圣经”:

只要重复做一件事,就要用循环语句,此时考虑循环从哪儿开始,满足什么条件继续循环,每次重复的是什么?

函数“圣经”:

函数调用,其实就是任务交接,此时,应指定任务交接给谁(函数名),要告知他哪些信息(实参)才能完成任务?

而在调用之前,你必须有一个函数能够完成你所移交的任务,即要先有函数定义,定义时想象自己是完成任务的那个人,而完成这个任务需要知道什么信息(形参),完成以后是否有结果(返回值)。

数据:

循环处理多个数据指针“圣经”:

定义指针的根本目的就是根据指针找到数据。

指针p指向哪儿?

间接引用的数据(*p)是多少?

是指针指向发生了变化(p=?

),还是间接引用的数据发生了变化(*p)=?

20,结束语,课程已全部结束,剩下的时间请大家认真复习,准备考试。

具体考试时间:

18周星期一六(6月23日)16:

10-18:

10考试内容:

大纲中的内容,抓住重点答疑方式:

邮件答疑问题较多请至旧行政楼206(数理学院二楼)有重要通知我会及时在网上公布,请随时关注我的个人主页http:

/,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1