第11章 文件.ppt

上传人:吴艺期 文档编号:388360 上传时间:2018-10-12 格式:PPT 页数:30 大小:193.50KB
下载 相关 举报
第11章 文件.ppt_第1页
第1页 / 共30页
第11章 文件.ppt_第2页
第2页 / 共30页
第11章 文件.ppt_第3页
第3页 / 共30页
第11章 文件.ppt_第4页
第4页 / 共30页
第11章 文件.ppt_第5页
第5页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、第11章 文件,11.1 C文件概述,文件与文件名,文件是指存放在外部存储介质上的数据集合。 为标识一个文件,每个文件都必须有一个文件名,其一般结构为:主文件名.扩展名,根据文件的存储形式,可分为ASCII码文件和二进制文件,读文件与写文件读文件是将磁盘文件中的数据传送到计算机内存的操作。写文件是从计算机内存向磁盘文件中传送数据的操作。,构成文件的基本单元与流式文件 语言将文件看作是由一个一个的字符(ASCII码文件)或字节(二进制文件)组成的。这种文件称为流式文件。,ANSI C的缓冲文件系统缓冲文件系统是指,系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。写文件时,必须首先输出到缓冲

2、区中。待缓冲区装满后,再一起输出到磁盘文件中。读文件时,则正好相反:首先将一批数据读入到缓冲区中,再从缓冲区中将数据逐个送到程序数据区。,11.2 文件的类型及其文件的指针,每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(文件名、文件状态、文件的当前位置等),这些信息是保存在一个结构体变量中的。,typedef struct short level; /* 缓冲区“满”或“空”的程度 */unsigned flags; /* 文件状态标志*/char fd; /* 文件描述符 */unsigned char hold; /* 如无缓冲区不读取字符 */short bsize; /

3、* 缓冲区大小*/unsigned char *buffer; /* 缓冲区的位置 */unsigned char *curp; /* 指针,当前的指向 */unsigned istemp; /* 临时文件,指示器 */short token; /* 用于有效性检查 */ FILE;,FILE f5; FILE *fp;,11.3 常用的文件函数,对文件进行操作之前,必须先打开该文件; 使用结束后,应立即关闭,以免数据丢失。 使用文件函数必须#include“stdio.h“,一.文件的打开fopen()函数用法: FILE *fp;fpfopen(“文件名“,“操作方式“); 功能:返回一个

4、指向指定文件的指针。 说明: (1)“文件名”是指要打开(或创建)的文件名。如果使用字符数组(或字符指针),则不使用双引号,直接写数组名或字符指针名。,11.3.1 文件打开与关闭,(2)“操作方式”如见书222页表111所示。(3)“r(b)+”与“a(b)+”的区别:使用前者打开文件时,读写位置指针指向文件头;使用后者时,读写指针指向文件尾。,(4)如果不能实现打开指定文件的操作,则fopen()函数返回一个空指针NULL (其值在头文件stdio.h中被定义为0)。为增强程序的可靠性,常用下面的方法打开一个文件:FILE *fp; if(fp=fopen(“文件名“,“操作方式“)=NU

5、LL) printf(“can not open this filen“); exit(0); ,(5)在程序开始运行时,系统自动打开三个标准文件,并分别定义了文件指针:标准输入文件stdin:指向终端输入(一般为键盘)。如果程序中指定要从stdin所指的文件输入数据,就是从终端键盘上输入数据。标准输出文件stdout:指向终端输出(一般为显示器)。标准错误文件stderr:指向标准错误输出(一般为显示器)。,关闭已打开的所有文件,结束程序运行 0表示正常退出,非0表示程序出错退出,例 文件打开与测试 FILE *fp;fp=fopen(“aa.c”,“w”);if(fp=NULL) prin

6、tf(“File open error!n”);exit(0);,例 FILE *fp;fp= fopen (“c:fengyibkctest.dat”,”r”);,例 FILE *fp;char *filename=“c:fengyibkctest.dat”fp= fopen(filename,”r”);,二. 文件的关闭fcolse函数,函数原型: int fclose(FILE *文件指针); 用法:fclose(文件指针变量名) 功能:关闭“文件指针”所指向的文件。如果正常关闭了文件,则函数返回值为;否则,返回值为非。例如:FILE *fp;fp=fopen(“data.c“,“r“)

7、; fclose(fp);/*关闭fp所指向的文件*/,11.3.2 文件的读写,文件打开之后,就可以对它进行读与写的操作了 文件中有一个读写位置指针,指向当前的读写位置。每次读写1个(或1组)数据后,系统自动将位置指针移动到下一个读写位置上。,一. 文件的字符读写 1.将一个字符写到文件中fputc()函数 函数原型:int fputc(char c, FILE *stream); 用法:fputc(字符数据,文件指针);其中“字符数据”,既可以是字符常量,也可以是字符变量。 功能:将字符数据输出到“文件指针”所指向的文件中去,同时将读写位置指针向前移动1个字节(即指向下一个写入位置)。 返

8、回值:输出成功,则返回值是输出的字符数据;否则,返回一个符号常量EOF(其值在头文件stdio.h中,被定义为-1)。 例如:fputc(ch,fp);将字符(ch的值)输出到fp所指向的文件中去。,2.从文件中读一个字符fgetc()函数 函数原型:int fputc( FILE *stream); 用法: fgetc(文件指针); 功能:从“文件指针”所指向的文件中,读入一个字符,同时将读写位置指针向前移动1个字节(即指向下一个字符)。 返回值:如果在读字符时遇到文件结束符,函数返回一个文件结束标志EOF(即-1),否则返回所读的字符。例如,chfgetc(fp) ; 对二进制文件执行读入

9、操作时,必须使用库函数feof()来判断是否遇到文件尾。如果遇到文件尾,feof返回1;否则,则返回0。,while(!feof(fp)c=fgetc(fp); ,#include main() FILE *fp;char ch,*filename=“out.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();fc

10、lose(fp); ,#include main() FILE *fp;char ch,*filename=“out.txt”;if(fp=fopen(filename,”r“)=NULL) printf(“cannot open filen“);exit(0);while(ch=fgetc(fp)!=EOF)putchar(ch);fclose(fp); ,例 从键盘输入字符,逐个存到磁盘文件中,直到输入#“为止,例 读文本文件内容,并显示,判断文本文件是否结束,判断二进制文件是否结束while(!feof(fp) c=fgetc(fp);,#include main() FILE *in,

11、 *out;char ch,infile10,outfile10;scanf(“%s“,infile);scanf(“%s“,outfile);if (in = fopen(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); ,feof 函数原型: in

12、t feof(FILE *fp) 功能:判断文件是否结束 返值:文件结束,返回真(非0);文件未结束,返回0,二. 文件的字符串读写 fgets()和fputs()函数 1.库函数fputs()向指定文件输出一个字符串 用法:fputs(字符串,文件指针); “字符串”可以是一个字符串常量,或字符数组名,或字符指针变量名 功能:向指定文件输出一个字符串,同时将读写位置指针向前移动(字符串长度)个字节。如果输出成功,则函数返回值为;否则,为非值2.库函数fgets()从文件中读一个字符串 用法:fgets(指针,串长度+1,文件指针); 功能:从指定文件中读入一个字符串,存入“字符数组指针”中,

13、并在尾端自动加一个结束标志0;同时,将读写位置指针向前移动(字符串长度)1个字节。如果在读入规定长度之前遇到文件尾EOF或换行符,读入即结束。,11.3.2 文件的读写,fputs(“china“,fp); fgets(str,n+1,fp);,例 从键盘读入字符串存入文件,再从文件读回显示,#include main() FILE *fp;char string81;if(fp=fopen(“file.txt“,“w“)=NULL) printf(“cannt open file“);exit(0); while(strlen(gets(string)0) fputs(string,fp);

14、fputs(“n“,fp);fclose(fp);if(fp=fopen(“file.txt“,“r“)=NULL) printf(“cannt open file“);exit(0); while(fgets(string,81,fp)!=NULL)fputs(string,stdout);fclose(fp); ,三. 读写文件中的一个数据块 实际应用中,常常要求1次读写1个数据块(一个实数或一个结构体变量的值)。 fread( ) 和fwrite()函数。 用法:fread(buffer,size, count,fp);fwrite(buffer,size, count,fp); 功能:

15、 fread()从fp所指向文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放到从buffer开始的内存中;同时,将读写位置指针向前移动size* count个字节。buffer是存放读入数据的起始地址(即存放何处) fwrite()从buffer开始,一次输出size个字节,重复count次, 并将输出的数据存放到fp所指向的文件中;同时,将读写位置指针向前移动size* count个字节。其中,buffer是要输出数据在内存中的起始地址(即从何处开始输出)。 如果调用fread()或fwrite()成功,则函数返回值等于count。,fread(f,4,2,f

16、p);,11.3.2 文件的读写,例 float f2;FILE *fp;fp=fopen(“aa.dat”,“rb”);fread(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 a

17、ddr15; studSIZE; main() int i;for(i=0;iSIZE;i+)scanf(“%s%d%d%s“,studi.name, ,void save() FILE *fp;int i;if(fp=fopen(“d:fengyiexestu_dat“,“wb“)=NULL) printf(“cannot open filen“);return;for(i=0;iSIZE;i+)if(fwrite( ,void display() FILE *fp;int i;if(fp=fopen(“d:fengyiexestu_dat“,“rb“)=NULL) printf(“cann

18、ot open filen“);return;for(i=0;iSIZE;i+) fread( ,四. 对文件进行格式化读写fscanf()和fprintf()函数,与scanf()和printf()函数的功能相似,区别在于:fscanf()和fprintf()函数的操作对象是指定文件,而scanf()和printf()函数的操作对象是标准输入(stdin)输出(stdout)文件。,用法:fscanf(文件指针,“格式符“,输入变量首地址表);fprintf(文件指针,“格式符“,输出参量表);,例如,int i=3; float f=9.80;fprintf(fp,“%2d,%6.2f“,

19、 i, f);,表示将变量i按%2d格式、变量f按%6.2f格式, 以逗号作分隔符,输出到fp所指向的文件中:3,9.80(表示1个空格)。,11.3.2 文件的读写,读写函数的选用原则,从功能角度来说,fread()和fwrite()函数可以完成文件的任何数据读写操作。 但为方便起见,依下列原则选用: 1读/写1个字符(或字节)数据时:选用fgetc()和fputc()函数。 2读/写1个字符串时:选用fgets()和fputs()函数。 3读/写1个(或多个)不含格式的数据时:选用fread()和fwrite()函数 4读/写1个(或多个)含格式的数据时:选用fscanf()和fprint

20、f()函数,11.3.3 文件的定位,文件打开之后,就可以对它进行读与写的操作了 文件中有一个读写位置指针,指向当前的读写位置。每次读写1个(或1组)数据后,系统自动将位置指针移动到下一个读写位置上。 如果想改变系统这种读写规律,可使用有关文件定位的函数。,一. 位置指针复位函数rewind() 用法:rewind(文件指针); 功能:使文件的位置指针返回到文件头 例如:rewind(fp);,例 对一个磁盘文件进行显示和复制两次操作,#include main() FILE *fp1,*fp2;fp1=fopen(“d:fengyibkcch12_4.c“,“r“);fp2=fopen(“d

21、:fengyibkcch12_41.c“,“w“);while(!feof(fp1) putchar(getc(fp1);rewind(fp1);while(!feof(fp1) putc(getc(fp1),fp2);fclose(fp1);fclose(fp2); ,二. 随机读写和fseek() 函数 对于流式文件,既可以顺序读写,也可随机读写,关键在于控制文件的位置指针。 顺序读写是指,读写完当前数据后,系统自动将文件的位置指针移动到下一个读写位置上。 随机读写是指,读写完当前数据后,可通过调用fseek()函数,将位置指针移动到文件中任何一个地方。,用法:fseek(文件指针,位移量

22、,参照点);功能:将指定文件的位置指针,从参照点开始,移动指定的字节数。 说明: (1)参照点:0(文件头)、1(当前位置)和(文件尾)在ANSI C标准中,还规定了下面的名字:SEEK_SET文件头,SEEK_CUR当前位置,SEEK_END文件尾 (2)位移量:以参照点为起点,向前(当位移量时)或后(当位移量时)移动的字节数。在ANSI C标准中,要求位移量为long int型数据。,fseek() 函数,fseek(fp,100L,0); fseek(fp,50L,1); fseek(fp,-10L,SEEK_END);,三. 返回文件当前位置的函数ftell() 由于文件的位置指针可以

23、任意移动,也经常移动,往往容易迷失当前位置,ftell()就可以解决这个问题。 函数原型:long ftell(FILE *stream); 用法:ftell(文件指针); 功能:返回文件位置指针的当前位置(用相对于文件头的位移量表示)。如果返回值为-1L,则表明调用出错。例如:offset=ftell(fp);if(offset=-1L)printf(“ftell() errorn”);,例 fseek(fp,100L,0);fseek(fp,50L,1);fseek(fp,-10L,2);,例 磁盘文件上有3个学生数据,要求读入第1,3学生数据并显示,#include“stdio.h“ma

24、in() FILE *fp;char filename80;long length;gets(filename);fp=fopen(filename,“rb“);if(fp=NULL)printf(“file not found!n“);else fseek(fp,0L,SEEK_END);length=ftell(fp);printf(“Length of File is %1d bytesn“,length);fclose(fp);,例 求文件长度(ch12_101.c),11.3.4 出错的检测,一. ferror()函数在调用输入输出库函数时,如果出错,除了函数返回值有所反映外,也可利

25、用ferror()函数来检测。 用法: ferror(文件指针); 功能:如果函数返回值为0,表示未出错;如果返回一个非0值,表示出错。 说明: (1)对同一文件,每次调用输入输出函数均产生一个新的ferror()函数值。因此在调用了输入输出函数后,应立即检测,否则出错信息会丢失。 (2)在执行fopen()函数时,系统将ferror()的值自动置为0。 例如:ferror(fp);,二. clearerr()函数函数原型:void clearerr(FILE *stream); 用法: clearerr(文件指针); 功能:将文件错误标志(即ferror()函数的值)和文件结束标志(即feof()函数的值)置为0。,例 ferror()与clearerr()举例,#include int main(void) FILE *stream;stream = fopen(“DUMMY.FIL“, “w“);getc(stream);if (ferror(stream) printf(“Error reading from DUMMY.FILn“);clearerr(stream);if(!ferror(stream)printf(“Error indicator cleared!“);fclose(stream);return 0; ,

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

当前位置:首页 > 教学课件 > 大学教育

copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1