C语言程序设计课件:9 文件_第1页
C语言程序设计课件:9 文件_第2页
C语言程序设计课件:9 文件_第3页
C语言程序设计课件:9 文件_第4页
C语言程序设计课件:9 文件_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、9 文件7/22/20221解析C程序设计第2章 简单程序设计文件系统缓冲型文件系统:系统自动在内存中为每个文件开辟一个缓冲区,作为程序和磁盘文件数据交流的中间媒介.3、关闭文件(写入磁盘)变量(内存)2、读写文件(磁盘)1、打开文件(写入缓冲区)文件缓冲区(内存)三步中的每一步都是通过C语言的库函数实现2解析C程序设计第2章 简单程序设计与文件输入输出相关的库函数#include 打开:fopen();读写:fgetc(); fputc();fgets(); fputs();fread(); fwrite();fscanf(); fprintf();文件定位指针rewind(); fseek

2、(); ftell();feof();关闭:fclose();法宝:每个库函数在调用时可以查询。TC:CTRL+F1VC 输入函数名即可看到函数形参。3解析C程序设计第2章 简单程序设计要解决的问题1:将学生信息存入文件,再从文件调入数组#include#define N 30struct stuchar name10;int num;int age;char addr15; ; 4解析C程序设计第2章 简单程序设计1、输入学生信息存入数组void main()struct stu boyaN,boybN,*pp,*qq; FILE *fp; /*定义一个用于指向FILE类型的指针fp*/in

3、t i; printf(ninput datan);for(i=0,pp=boya;iname,&pp-num,&pp-age,pp-addr); FILE类型是在stdio.h文件中定义的。 typedef struct int level; /*缓冲区满或空的程度*/ unsigned flags; /*文件状态标志*/ char fd; /*文件描述符*/ unsigned char hold; /*如无缓冲区不读字符*/ short bsize; /*缓冲区的大小*/ unsigned char *buffer;/*数据缓冲区的位置*/ unsigned char *curp; /*文

4、件定位指针*/ unsigned istemp; /*临时文件指示器*/ short token; /*用于有效性检查*/ FILE;5解析C程序设计第2章 简单程序设计2、存入文件(打开文件-存储-关闭文件) /*先要打开文件*/if(fp=fopen(stu_list.dat,wb+)=NULL)printf(Cannot open file strike any key exit!);exit(1);FILE *fopen(char *filename, char * type);例:FILE *fp = fopen(C:CONFIG.SYS, rw);filename是文件名包含路径。

5、如果不含路径,表示打开当前目录下的文件type是打开方式常用为r、w、rw和a,分别表示只读、只写、读写和添加“b”表示二进制文件,不写“b”表示文本文件返回值为指向此文件的指针,留待以后使用如果打开失败,返回值为NULLint a=30000; ASCII码文件中存储格式:3 ,0 ,0 ,0, 0,(5个字节)二进制文件中存储格式:30000的补码(2个字节),即 11101010 01100000二者各有特点:ASCII文件浪费空间和时间,直观二进制文件节省空间和时间,不直观6解析C程序设计第2章 简单程序设计2、存入文件(打开文件-存储-关闭文件)/*存入文件(输出到文件)*/for(

6、i=0,pp=boya;iname,pp-num,pp-age,pp-addr);如果存储的全部是字符类型,也可以用fwrite( pp, sizeof(struct stu), 1, fp);int fprintf(FILE *fp, char *format, arg1, , argn)函数功能:按照format给出的控制符格式,将变元arg1,argn的值写入到fp所指向的文件中去 。unsigned fwrite(void *ptr,unsigned size,unsigned numb,FILE *fp);函数功能:把从ptr开始的numb个size大小的数据块写入fp指向的文件,函

7、数调用成功返回count的值,否则返回-1。当写一个字符或一个字符串时,可用fputc()和fputs().int fputc(int c, FILE *fp);功能:向fp输出字符c若写入错误,则返回EOF,否则返回c例:fputc(a, fp); /*将字符a写到fp指向的文件*/int fputs(char *s, FILE *fp);功能:将字符串写到fp指向的文件中去成功时返回0,出错时返回EOF例:fputs(“abcde”, fp); /*将字符串写到fp指向的文件*/7解析C程序设计第2章 简单程序设计2、存入文件(打开文件-存储-关闭文件)/*最后关闭文件*/fclose(f

8、p);int fclose(FILE *fp);函数功能:关闭文件,此时,fp不再指向文件在内存的缓冲区。返回值:关闭成功时返回值为0。否则(如磁盘空间不足、写保护或关闭已经关闭的文件)返回EOF,即-1。8解析C程序设计第2章 简单程序设计3、从文件读入到数组(打开文件-读入到数组-关闭文件)if(fp=fopen(stu_list.dat,rb)=NULL)printf(Cannot open file strike any key exit!);exit(2); for(i=0;iname,&qq-num,&qq-age,qq-addr);printf(nnnametnumber age

9、 addrn);qq=boyb;for(i=0;iname,qq-num, qq-age,qq-addr);fclose(fp);输出到stdout文件,即输出到屏幕。其实,从键盘输入、输出到屏幕与报错都是以文件的形式来存储信息,这三个标准设备文件分别是stdin,stdout,stderr从用户角度对文件分类,可分为两类:标准设备文件和普通磁盘文件9解析C程序设计第2章 简单程序设计要解决的问题2:复制文件输入两个文件名打开这两个文件将一个文件的内容复制到另外一个文件中关闭这两个文件10解析C程序设计第2章 简单程序设计#include#includevoid main() FILE *fp

10、1,*fp2; char ch,file130,file230;printf(Input source file :);scanf(%s,file1); /*输入源文件名*/printf(Input object file :);scanf(%s,file2); /*输入目的文件名*/if(fp1=fopen(file1,r)=NULL)printf(Cannot open %sn,file1);exit(1); /*打开源文件*/if(fp2=fopen(file2,w)=NULL) fp2=stdout; /*打开目的文件,找不到的话输出到屏幕*/ /*从源文件中读一个字符,并写入目的文件

11、中*/while(ch=fgetc(fp1)!=EOF) fputc(ch,fp2); fclose(fp1); /*关闭两个文件*/fclose(fp2); 11解析C程序设计第2章 简单程序设计/*copy.c*/#include#includevoid main( int argc,char *argv )FILE *fp1,*fp2; char ch;if(argc!=3) puts(error in parameters!); exit(0); if(fp1=fopen( argv1 , r)=NULL)printf(Cannot open %sn,argv1);exit(1); /

12、*打开源文件*/if(fp2=fopen( argv2 ,w)=NULL) fp2=stdout; /*打开目的文件,找不到的话输出到屏幕*/*从源文件中读一个字符,并写入目的文件中*/while(ch=fgetc(fp1)!=EOF) fputc(ch,fp2); fclose(fp1); /*关闭两个文件*/fclose(fp2); /*该程序编译后,要在dos命令行下输入3个参数方能运行,第一个是该程序的名字copy,第二个是源文件名,第三个是目的文件名。整个程序的功能是实现文件复制*/12解析C程序设计第2章 简单程序设计如何随机读写文件的某一部分?前边对文件的读写都是从头开始,按顺序

13、读(写)。如何只读写文件的某一部分呢?除有FILE *类型的指针fp指向文件的开始外,还有一个char *类型的文件定位指针curp,指向文件内部下一个要读(写)的字符。我们可以通过改变curp的位置实现随机读写。.fp文件定位指针curp13解析C程序设计第2章 简单程序设计几个相关函数void rewind(FILE *fp); 功能:让fp中的文件定位指针指向文件开始位置int fseek(FILE *fp,long offset, int fromwhere);功能:把fp中的文件定位指针移动到相应位置fromwhere:SEEK_SET或0-文件开始SEEK_CUR或1-当前位置SE

14、EK_END或2-文件末尾long ftell(FILE *fp); 功能:返回fp中文件定位指针所在的位置int feof(FILE *fp);功能:当文件位置指针指向fp末尾时,返回非0值,否则返回0例:while(feof(fp)=0) c=fgetc(fp);14解析C程序设计第2章 简单程序设计#includestruct stu char name10; int num; int age; char addr15;boy,*qq=&boy;void main() FILE *fp; if(fp=fopen(stu.txt,rt)=NULL) printf(Cannot open f

15、ile strike any key exit!); exit(1); rewind(fp); /*将文件定位指针移至文件开始位置*/ fseek(fp,18,1); /*如果每个学生在文件中占18个字节,”略”过1个学生所占的18个字节*/ fscanf(fp,%s%d%d%s,qq-name,&qq-num,&qq-age,qq-addr); /*读第2个学生信息至qq*/ printf(“nnnametnumber age addrn”); /*输出第2个学生信息*/ printf(%st%5d %7d %sn,qq-name,qq-num,qq-age,qq-addr); fclose

16、(fp);例315解析C程序设计第2章 简单程序设计例4:程序结构:float Fun1(float x)/*函数1定义*/float Fun2(float x) /*函数2定义*/float Integral(float (*f)(float), float a, float b) /*求积分函数定义*/void main() y1=Integral(Fun1,a,b); /*对函数1求积分*/ y2=Integral(Fun2,a,b); /*对函数2求积分*/ 实参是函数名,形参是指向函数的指针其实,函数名也就是函数在内存中的首地址.指向函数的指针定义为:int (*p)();/*定义一

17、个变量p,是用来指向返回值为int的函数的*/指针的初始化为:p=max;/*f指向fun1*/函数调用时,可采用如下方式:max(a,b);P(a,b);(*p)(a,b);! (*max)(a,b)与p(a,b)不行16解析C程序设计第2章 简单程序设计函数指针变量作函数参数/*函数功能:求函数f在a,b的积分*/float Integral(float (*f)(), float a, float b)float s,h,y;int n,i;s = (*f)(a)+(*f)(b)/2.0;n = 100;h = (b-a)/n;for (i=0;in;i+)y = a+i*h; s +=

18、 (*f)(y);return s*h;17解析C程序设计第2章 简单程序设计小结文件的相关概念及相关库函数的调用带参数的main()指向函数的指针18解析C程序设计第2章 简单程序设计重点循环“圣经”:只要重复做一件事,就要用循环语句,此时考虑循环从哪儿开始,满足什么条件继续循环,每次重复的是什么?函数“圣经”:函数调用,其实就是任务交接,此时,应指定任务交接给谁(函数名),要告知他哪些信息(实参)才能完成任务?而在调用之前,你必须有一个函数能够完成你所移交的任务,即要先有函数定义,定义时想象自己是完成任务的那个人,而完成这个任务需要知道什么信息(形参),完成以后是否有结果(返回值)。数据:循环处理多个数据指针“圣经”

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论