C语言程序设计第十章.ppt_第1页
C语言程序设计第十章.ppt_第2页
C语言程序设计第十章.ppt_第3页
C语言程序设计第十章.ppt_第4页
C语言程序设计第十章.ppt_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、第十章 文件,10.1 概述,文件:存储在外部介质上数据的集合,是操作系统数据管理的单位 使用数据文件的目的 数据文件的改动不引起程序的改动程序与数据分离 不同程序可以访问同一数据文件中的数据数据共享 能长期保存程序运行的中间数据或结果数据,概述,C语言把文件看作一个字节序列,即由一连串的字节组成,称为“流(stream)” ,以字节为单位访问,没有记录的界限,文件分类 按文件的逻辑结构: 记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成 按存储介质: 普通文件:存储介质文件(磁盘、磁带等) 设备文件:非存储介质(键盘、显示器、打印机等) 按数据的

2、组织形式: 文本文件: ASCII文件,每个字节存放一个字符的ASCII码 二进制文件:数据按其在内存中的存储形式原样存放,如 int型数10000,内存存储形式,二进制形式,ASCII形式,文本文件特点: 存储量大、速度慢、便于对字符操作,二进制文件特点: 存储量小、速度快、便于存放中间结果,文件处理方法 缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区 非缓冲文件系统:低级文件系统,由用户在程序中为每个文件设定缓冲区,10.2 文件类型指针,要调用一个文件,需要有以下的信息 文件当前的读写位置 与该文件对应的内存缓冲区的地址 缓冲区中未被处理的字符串 文件操作方式等,缓冲

3、文件系统为每个正使用的文件在内存开辟文件信息区 文件信息用系统定义的名为FILE的结构体描述 FILE定义在stdio.h中,typedef struct int _fd; /* 文件号 */int _cleft; /* 缓冲区中剩下的字节数 */int _mode; /* 文件操作模式 */char * _nextc; /* 下一个字节的位置 */char * _buff;/*文件缓冲区位置 */ FILE,文件类型指针,文件类型指针 指针变量说明: FILE *fp; 用法: 文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息,访问文件 文件关闭后,它

4、的文件结构体被释放,10.3 文件的打开与关闭,文件操作用库函数实现,包含在stdio.h 文件使用方式:打开文件-文件读/写-关闭文件 系统自动打开和关闭三个标准文件: 标准输入-键盘 stdin 标准输出-显示器 stdout 标准出错输出-显示器 stderr,文件的打开,FILE * fopen(const char *filename,const char *mode,文件名(可以包含逻辑驱动器、 路径、文件名、扩展名,打开方式,返回值,功能:按指定方式从磁盘上查找指定的文件或创建一个新文件。 返值:正常打开,为指向文件结构体的指针;打开失败,为NULL,例:FILE *fp;fp

5、= fopen(file1,r); 如果成功打开,返回一个指向被打开文件的文件信息区的起始地址;如果打开失败,返回一个NULL指针,文件的打开,说明: 打开文件的方式,必须与文件的属性兼容。例如,不能以“w”和“a”方式打开具有“只读”属性的文件。但可以以任何方式打开“隐藏”属性文件。 DOS/Windows中,无“只写”文件属性,一个文件可写,同时意味着可读。 用带“r”的方式(“r”、“rb”、“r+”、“rb+”)打开文件时,若文件不存在,则返回NULL指针。一般用以下方式检查是否成功打开: FILE *fp; if (fp=fopen(file1, r) = =NULL ) print

6、f(cannot open this filen);exit(0); /* exit(0)是程序返回操作系统*/,文件的打开,在Turbo C2.0中,用带“a”或带“w”的方式打开文件时,若文件不存在,则创建该文件。但fopen()函数仍可能因为磁盘写保护或目录满而失败。 在Turbo C2.0中,用带a或带w的方式打开文件时,若文件已存在,a方式在原文件后追加数据,w方式把原文件删除、并重新创建一个相同名字的文件,文件的关闭,int fclose(FILE *fp,文件打开时返回的文件类型指针,功能:关闭fp指向的文件,使文件指针变量与文件“脱钩”,释放文件结构体和文件指针 返值:正常关闭

7、为0;出错时,非0,不关闭文件可能会丢失数据,10.4 文件的读写,fputc的函数原型为,int fputc(char ch, FILE *fp,作用:将ch中的字符输出到fp所指向的文件中,通常用于往文本文件中写入一个字符,返回值:输出成功则返回所输出的字符,失败则返回EOF,fgetc的函数原型为,int fgetc(FILE *fp,作用:从fp所指向的文件中读入一个字符,返回值:返回所读的字符,如发生错误或读到文件结束符失败则返回EOF,例 从键盘输入字符,逐个存到磁盘文件中,直到输入#“为止,include main() FILE *fp; char ch,*filename=“o

8、ut.txt”; if(fp=fopen(filename,w)=NULL) printf(cannot open filen); exit(0); printf(Please input string:); ch=getchar(); while(ch!=#) fputc(ch,fp); putchar(ch); ch=getchar(); fclose(fp);,例 读文本文件内容,并显示,include main() FILE *fp; char ch,*filename=“out.txt”; if(fp=fopen(filename,”r)=NULL) printf(cannot op

9、en filen); exit(0); while(ch=fgetc(fp)!=EOF) putchar(ch); fclose(fp);,判断文本文件是否结束,判断二进制文件是否结束 while(!feof(fp) c=fgetc(fp); .,feof 函数原型: int feof(FILE *fp) 功能:判断文件是否结束 返值:文件结束,返回真(非0);文件未结束,返回0,include main() FILE *in, *out; char ch,infile10,outfile10; scanf(%s,infile); scanf(%s,outfile); if (in = fop

10、en(infile, r)= NULL) printf(Cannot open infile.n); exit(0); if (out = fopen(outfile, w)= NULL) printf(Cannot open outfile.n); exit(0); while (!feof(in) fputc(fgetc(in), out); fclose(in); fclose(out);,fwrite的函数原型为,unsigned fwrite(void *buffer, unsigned size, unsigned count, FILE *fp,作用:将buffer所指向的内存单

11、元开始的内存区中的长度为size的count个数据项写入fp所指向的文件中,返回值:调用成功则返回实际输入的数据项,即count的值,fwrite函数主要用于二进制文件的写操作,可以将一个数据块(即一组数据)写到文件中,fread的函数原型为,unsigned fread(void *buffer, unsigned size, unsigned count, FILE *fp,作用:从fp所指向的文件中将读出每项长度为size的count个数据项,存放到buffer所指向的内存单元开始的存储区中,返回值:返回实际所读出的数据项,即count的值,fread函数主要用于二进制文件的读操作,从文

12、件中读出一组数据,如果文件以二进制形式打开,用fread和fwrite可以读写任何类型的信息,若f 为float型数组,共10个元素,fread(f, 4, 10, fp,fread(f, sizeof(float), 10, fp,fread(f, 8, 5, fp,fwrite(f, sizeof(float), 10, fp,若有结构体类型,struct student long num; char name; float score3; stu30,for (i=0; i30; i+) fwrite,for (i=0; i30; i+) fread,说明,由fputc函数建立的文件,通

13、常由fgetc函数读取,它们的操作对象均为字符,所以称为字符读写函数,由fwrite函数建立的文件,通常由fread函数读取,它们以数据块为单位进行读写,所以称为块读写函数,关于文件追加的含义,追加数据时,文件中的原有数据仍然存在,新写入的数据写到原文件数据之后,打开文件时,系统内部存在一个位置指针,指出对数据操作的位置,用r、w、rb、wb打开文件时,位置指针指向文件开始处;读写时总是文件的第一个数据,用a、ab打开文件时,位置指针则指向整个文件最后一个数据之后;写数据时追加到了原有数据之后,例 float f2; FILE *fp; fp=fopen(“aa.dat”,“rb”); fre

14、ad(f,4,2,fp,for(i=0;i2;i+) fread,例 struct student int num; char name20; char sex; int age; float score3; stud10; for(i=0;i10;i+) fread,例 从键盘输入4个学生数据,把他们转存到磁盘文件中去,include #define SIZE 2 struct student_type char name10; int num; int age; char addr15; studSIZE; main() int i; for(i=0;iSIZE;i+) scanf(%s%

15、d%d%s,,void save() FILE *fp; int i; if(fp=fopen(stu_dat,wb)=NULL) printf(cannot open filen); return; for(i=0;iSIZE;i+) if(fwrite(,格式化I/O:fprintf与fscanf 函数原型,int fprintf(FILE *fp,const char *format,argument,) int fscanf(FILE *fp,const char *format,address,功能:按格式对文件进行I/O操作 返值:成功,返回I/O的个数;出错或

16、文件尾,返回EOF,例 fprintf(fp,“%d,%6.2f”,i,t); /将i和t按%d,%6.2f格式输出到fp文件 fscanf(fp,“%d,%f”, /若文件中有3,4.5 ,则将3送入i, 4.5送入t,例 从键盘按格式输入数据存到磁盘文件中去,include main() char s80,c80; int a,b; FILE *fp; if(fp=fopen(test,w)=NULL) puts(cant open file); exit() ; fscanf(stdin,%s%d,s,字读写函数 putw和 getw,用来对磁盘读写一个字。使用putw可以往指定文件写一

17、个字,即一个整数;使用getw可以从文件中读出一个整数,1、putw的函数原型为,int putw(int w, FILE *fp,作用:向fp所指向的文件中写入一个字,返回值:操作成功返回所输出的字,不成功则返回EOF,putw(20, fp,将整数20写到fp所指向的文件中,2、getw的函数原型为,int getw(FILE *fp,作用:从fp所指向的文件中读出一个字,返回值:读出成功则返回所读的字,发生错误或文件结束则返回EOF,i=getw(fp,读取fp所指向文件中的一个整数,赋给整型变量i,10.5 文件的定位,一、 rewind函数,rewind的函数原型为,void rew

18、ind(FILE *fp,作用:使位置指针重新返回文件的开头,返回值:无,二、 位置指针随机移动函数 fseek,所谓随机读写,是指读完上一个字符后,并不一定要读写其后继的字符,而可以读写文件中任意所需的字符,fseek的函数原型为,int fseek(FILE *fp, long offset, int base,作用:将fp所指向文件的位置指针,移到以base所指的位置为起始点、以offset为位移量的位置,同时清除文件结束标志,返回值:定位成功则返回非0,否则返回0,int fseek(FILE *fp, long offset, int base,说明,起始点base可以是:SEEK_

19、SET、SEEK_CUR、SEEK_END三个符号常量,其值分别为0、1、2;分别表示文件开始、文件当前位置、文件末尾,位移量offset表示以起始点为基准,向前或向后移动的字节数(为正表示向文件尾部的方向的移动,为负则表示向文件头部的方向移动);要求在数字后面加一个字母“L”,表示是长整型数,例,fseek(fp, 2, SEEK_SET,将文件位置指针从文件开始处向后移动2个字节,fseek(fp, 2, 0,fseek(fp, 2, SEEK_CUR,将文件位置指针从当前位置向后移动2个字节,fseek(fp, 2, 1,fseek(fp, -5, SEEK_END,将文件位置指针从文件末尾向文件头部的方向移动5个字

温馨提示

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

评论

0/150

提交评论