第十三章:文件.ppt_第1页
第十三章:文件.ppt_第2页
第十三章:文件.ppt_第3页
第十三章:文件.ppt_第4页
第十三章:文件.ppt_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、第13章 文件,13.1 C文件概述 本章主要介绍C文件的一般概念,文件指针以及对文件的打开、关闭、读、写、定位等操作。文件的分类 文件就是一组存储在外部介质上的数据集合。 磁盘文件 一批数据是以文件形式存放在磁盘上。 设备文件把外部设备作为文件来对待。 对外部设备的输入输出操作就是读写设备文件的过程。 对设备文件的读写与对一般磁盘文件的读写方法完全相同。,对文件的处理方法有两种: (1)一种叫“缓冲文件系统” (2)一种叫“非缓冲文件系统” 缓冲文件系统,磁盘,系统自动地在内存区为每一个 正在使用的文件名开辟一个缓冲区。,从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁

2、盘去。,充满缓冲区,如果从磁盘向内存读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量),非缓冲文件系统 系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。 用缓冲文件系统进行的输入输出又称为高级(或高层)磁盘输入输出。 用非缓冲文件系统进行的输入输出又称为低级(或低层)输入输出。 1983年ANSI C标准决定不采用非缓冲文件系统,而只采用缓冲文件系统。也就是说,用缓冲文件系统既可处理文本文件,又可处理二进制文件。,13.2 文件类型指针,在C语言程序中,无论是一般磁盘文件还是设备文件,都可以通过文件结构类型的

3、数据集合进行输入输出操作。 在打开一个文件时,系统在内存区域中自动建立一个文件结构体变量,它包含了处理文件所需的各种信息,文件结构是由系统定义的,取名为FILE。 程序用到一个文件,系统就为此文件开辟一个结构体变量,用到几个文件,系统就开辟几个结构体变量,用来存放各个文件的有关信息。这些结构体变量不用变量名来标识,而是由用户设置指针来指向FILE类型的结构体变量。,在stdio.h文件中有以下类型定义: typedef struct int cnt; /*characters left*/ char *ptr; /*next charactors position*/ char *base;

4、/*location of buffer */ int flage; /*modi of access */ int fd; /*file descriptor*/ FILE; 有了FILE类型以后可以定义文件类型指针变量。,13.3 文件的打开与关闭,对文件进行操作之前必须“打开”文件,打开文件的作用实际上是建立该文件的信息结构,并且给出指向该信息结构的指针以便对该文件进行访问。 文件使用结束之后应该“关闭”该文件。 文件的打开与关闭是通过调用fopen和fclose函数来实现的。 文件处理的一般步骤: 首先打开文件,建立文件指针与外部文件的联系; 然后通过文件指针进行读写操作; 最后关闭文

5、件,切断文件指针与外部文件之间的联系。,13.3.1 文件的打开(fopen 函数),ANSI C规定了标准输入输出函数库,函数fopen用来实现文件的打开。 打开文件的一般形式: FILE *fp; fp=fopen(文件名,使用文件方式); 其中,fp是一个指向FILE类型结构的指针变量。 可以使fp指向某一个文件的结构变量,从而能够通过该结构变量中的文件信息去访问该文件。,同一指针变量通过对它的赋值也可以指向不同的文件。例如: FILE *fp; fp=fopen(“A1.txt”,“r”); 它表示要打开名字为A1.txt的文件,使用文件方式为“读入”. fopen函数带回指向A1.t

6、xt文件的指针并赋给fp,这样fp就与A1.txt相联系了,或者说fp指向A1.txt文件。,使用文件方式可以是下列中任一项:,“r” 以只读方式打开一个已有的文本文件。“w” 以只写方式建立一个新的文本文件。 如果该文件已存在则将它删去,然后重新 建立一个新文件。“a” 以添加方式打开一个文本文件,在文件末 尾添加。 如果该文件不存在,则建立一个新文件后 再添加。“rb” 以只读方式打开一个已有的二进制文件。“wb” 以只写方式打开一个二进制文件。“ab” 以添加方式打开一个二进制文件。,“r+” 打开用于更新的文本文件(文件必须已 经存在)。 “w+” 创建用于更新的文本文件,如果该文件

7、存在则被替换为空文件。 “a+” 在文件的尾部进行添加和修改,如果文 件不存在,则建立一个新文件后再添加 和修改。 “rb+” 以读写方式打开一个已有的二进制文件。 “wb+” 以读写方式建立一个新的二进制文件。 “ab+” 以读写方式打开一个二进制文件。,fopen()函数的返回值,如果不能实现“打开”的任务,fopen函数将会带回一个出错信息。出错的原因可能是:用“r”方式打开一个并不存在的文件;磁盘出故障;磁盘已满无法建立新文件等。此时fopen函数将带回一个空指针值NULL(NULL在stdio.h文件中已被定义为0)。 常用下面的方法打开一个文件: if(fp=fopen(filel

8、,r)=NULL) printf(“cannot open this file n”); exit(0); ,exit()函数关闭所有文件,并使程序结束,返回到操作系统。,如果打开不成功,则fp的值为NULL 。屏幕上显示“connot open this file .” 。,13.3.2 文件的关闭(fclose)函数,“关闭”就是使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,用fclose函数关闭文件。 fclose函数调用的一般形式为: fclose(文件指针); 关闭文件时,缓冲区中所有未写出的数据被清仓,并回收系统分配的输入输出缓冲区。 如果文件关闭成功,fclose

9、函数返回值为0; 如果关闭出错,则返回值为EOF(-1)。 这可以用ferror函数来测试。,13.4 文件的读写,除getchar和putchar外,还有几个读/写函数: int fgetc(FILE *stream) fputc(int c, FILE *stream) getc(FILE *stream ) putc(int ch, FILE *stream ),13.4.1 文件的字符读写函数,1、将字符写到磁盘文件函数fputc 将c转换为unsigned char并写入流式文件stream中去。它返回写出的字母,出错时返回EOF. fputc函数的格式: fputc(ch,fp);

10、 其中,ch是要输出的字符,它可以是一个字符常量,也可以是一个字符变量。fp是文件指针变量,通常它从fopen函数得到返回值。,功能:是将字符(ch的值)输出到fp所指向的文件上。 如果输出成功,函数返回值是输出的字符; 如果输出失败,则返回EOF(-1)。 EOF是符号常量,在stdio.h中被定义为-1. fputc(ch,stdout)的作用是将ch的值在显示 器上输出,与函数putchar(ch)的功能完全 相同。,2、从磁盘文件读入字符函数fgetc 将从流式文件stream中读取一个字符(unsigned char),并将读取的字符转换为int返回,当遇文件尾或者出错时返回EOF。

11、 fgetc函数的调用形式为: ch=fgetc(fp); 其中,ch为字符变量,用来存放从文件中读入单个字符,fp为指向打开文件的指针变量.,例:将file1.txt的内容读入内存并显示在屏幕上 #include main() FILE *fp; char ch; if(fp=fopen(“file1.txt”,”r”)=NULL) printf(“connot open this file n”); exit(0); while(ch=fgetc(fp)!=EOF) putchar(ch); fclose(fp); 执行结果:输出I am a student,首先打开file1.txt文件

12、,操作方式规定为读方式,将file1.txt的结构体变量的地址指针赋给fp指针,若打开成功,则fp指向file1.txt文件,并执行while循环,将读入的字符赋给ch,调用putchar函数将ch送屏幕显示.,注: 访问磁盘时,是将数据成批地送入缓冲区,每执行一次fgetc(fp)函数从缓冲区取一个字符,而不是读一次磁盘、读入一个字符。 写磁盘时,也并非输入一个字符就写一个字符到磁盘文件中,而是将输入的数据先送缓冲区,再成批写到磁盘上,这样会节省较多时间。,13.4.2 fread函数和fwrite函数,读文件数据块函数fread fread函数的功能是在fp指定的文件中读取count次数据

13、项(每次size个字节),存放到buf指定的内存单元地址中去。出错时返回-1。 它的一般调用形式为: fread(buf,size,count,fp); 其中,buf为读入数据在内存中存放的起始地址; size为每次要读取的字节数; count是要读取多少个size字节的数据项; fp为文件类型指针。,数据块输出函数fwrite,fwrite函数的功能是从buf为首地址的内存中取出count次数据项(每次size个字节),写入到指定的文件中。出错时返回-1。 它的一般调用形式为: fwrite(buf,size,count,fp); 其中,buf为输出数据在内存中存放的首地址; size为每次

14、要输出到文件中的字节数; count为要输出的次数; fp为文件类型指针。,13.4.3 fprintf函数和fscanf函数,fpintf函数、fscanf函数与printf函数、scanf函数作用相仿,都是格式化读写函数,不同的是前两个函数读写的对象是磁盘文件。 它们的一般调用方式为: fprintf(文件指针,格式字符串,输出表列) fscanf(文件指针,格式字符串,输入表列) 例如: fprintf(fp,”%d”,”%6.2f”,i,t); fscanf(fp,”%d”,”%f”,13.4.4 其他读写函数,1、putw函数和getw函数 用来对磁盘文件读写一个字(整数)。 2、读

15、写其他类型数据 3、fgets函数和fputs函数 fgets的作用是从指定文件中读入一个字符串。 fgets(str,n,fp); fputs的作用是向指定的文件输出一个字符串。 fputs(”China”,fp);,13.5 文件的定位,文件中有一个位置指针,指向当前读写的位置。如果顺序读写一个文件,每次读写一个字符,则读写完一个字符后,该位置指针自动移动指向下一个字符位置。 当需要改变文件顺序读写的次序时,根据需要随时指定文件读写的位置,也就是能实现随机文件的读写,这就需要使用由C语言提供的文件定位函数来实现。,13.5.1 rewind函数,rewind( )函数的一般调用形式为: r

16、ewind(fp); 其中,fp是指向由fopen函数打开的文件指针,该函数的功能是使位置指针重新返回文件的开头,此函数没有返回值,例:有一磁盘文件file1.txt,第一次使它显示在屏幕上,第二次它复制到另一文件file2.txt上。 #include stdio.h“ main( ) FILE *fp1,*fp2; fp1=fopen(file1.txt,r); fp2=fopen(file2.txt,w); while(!feof(fp1) putchar(fgetc(fp1);rewind(fp1); while(!feof(fp1)fputc(fgetc(fp1),fp2);fclo

17、se(fp1); fclose(fp2);,当第一次显示在屏幕上以后,文件file1.txt的位置指针已指到文件末尾,feof的值为非0(真)。执行rewind函数,使文件的位置指针重新定位于文件开头,并使feof函数的值恢复为0(假)。,13.5.2 fseek函数,对于磁盘文件,一般是按照文件位置指针的自动下移来完成文件的顺序读写操作。 然而只要能够控制文件位置指针的移动,将文件位置指针移到需要读写的位置上,就可以实现文件随机读写操作。 C语言提供的fseek函数就是用来改变文件位置指针的。,fseek 函数的调用形式为: fseek(fp,offset,from);其中: fp为指向当前

18、文件的指针; offset为文件位置指针的位移量,指以起始位置为基准值向前移动的字节数,并要求offset为long型数据; from为起始位置,必须是0、1或2之一值,它们表示三个符号常数,在stdio.h中定义如下: 名字 数字 起始位置SEEK_SET 0 文件开头 SEEK_COR 1 文件当前指针位置 SEEK_END 2 文件末尾,fseek函数将文件指针fp移到由起始位置开始、位移量为offset的字节处。 fseek函数一般用于二进制文件。下面是fseek函数调用的几个例子: fseek(fp,100L,0);/*将位置指针移到离文件头 100个字节处*/fseek(fp,50L,1); /*将位置指针移到离当前位 置50个字节处*/fseek(fp,-10L,2); /*将位置指针从文件末尾处 向后退10个字节*/,13.5.3 ftell函数,ftell函数的功能是获得当前文件指针的位置,用相对于文件开

温馨提示

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

最新文档

评论

0/150

提交评论