《C语言第八次作业答案.ppt》由会员分享,可在线阅读,更多相关《C语言第八次作业答案.ppt(35页珍藏版)》请在金锄头文库上搜索。
1、第九章 文件9.1 文件概述9.2 文件的打开和关闭9.3 文本文件的输入和输出9.4 二进制文件的输入和输出9.5 其他文件库函数定位函数出错监测函数Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.9.1 文件概述文件是存储在外部介质上的数据的集合,由操作系统来管理。最常用的是磁盘(硬盘、U盘、光盘等)文件。 从文件数据的组织形式看文件可分为文本文件和二进制文件。 源程序文件一般是文本文件。 数据文件可是文本文件,
2、 也可是二进制文件。 C语言把文件都看作“字节流”文件,也称“流式文 件”,对文件的读写是以字节为单位的。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd. C语言中的文本文件的每个字节代表一个字符,存放的是该字符的ASCII码。 C语言中的二进制文件是把数据按其在内存中的存储形式照原样输出到磁盘上。 C语言中对文件处理的方法可分为两种: 缓冲文件系统 系统自动为打开的文件开辟其各自的内存缓冲区,本章介绍的文本文件和二
3、进制文件都属此种。 非缓冲文件系统 系统不自动开辟内存缓冲区,而由用户根据需要在程序中设定。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.9.2 文件的打开和关闭文件类型(FILE)指针fopen函数fclose函数Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 As
4、pose Pty Ltd.文件类型(FILE)指针FILE类型类型 处理一个文件应知它的各种信息,这些信息由系统将其构处理一个文件应知它的各种信息,这些信息由系统将其构成一个结构体类型,取名成一个结构体类型,取名 FILE, ,谓之谓之文件类型文件类型,其定义放,其定义放在在stdio.h头文件中。头文件中。 typedef struct short level; /* fill/empty level of buffer */ unsigned flags; /* File status flags */ char fd; /* File descriptor */ unsigned cha
5、r hold; /* Ungetc char if no buffer */ short bsize; /* Buffer size */ unsigned char *buffer; /* Data transfer buffer */ unsigned char *curp; /* Current active pointer */ unsigned istemp; /* Temporary file indicator */ short token; /* Used for validity checking */ FILE; Evaluation only.Created with A
6、spose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd. FILE类型指针包含了stdio.h头文件就可用FILE来定义文件类 型的指针变量。 如: FILE *fp; 可以使fp指向某一文件的结构体变量,从而可通过读取该结构体变量中的各项信息来实现对该文件的操作。 一个文件指针用来操作一个文件。如有n个文件,一般应定义n个文件类型指针变量来分别指向n个文件。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client
7、Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.fopen-文件打开函数原型:FILE *fopen ( char *filename, char *mode ); 调用时: filename(文件名)为要打开文件的文件名(字符串),可写成: test.dat 或定义过 char s =test.dat; 则写 s ; 或定义过 char *pc =test.dat; 则写 pc ; 或定义过 #define ff test.dat; 则写 ff 。Evaluation only.Created with Aspose.Slides for
8、 .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd. mode 为文件使用方式或称打开方式,可以是: r 只读,为输入打开一个文本文件; w 只写,为输出打开一个文本文件; a 追加,向文本文件尾追加数据; rb 只读,为输入打开一个二进制文件; wb 只写,为输出打开一个二进制文件; ab 追加,向二进制文件尾追加数据; r+ 读写,为读/写打开一个文本文件; w+ 读写,为读/写建立一个新文本文件; a+ 读写,为读/写(追加)打开一个文本文件; “rb+” 读写,为读/写打开一个二进制文件; wb+ 读写
9、,为读/写打开一个二进制文件; ab+ 读写,向读/写二进制文件尾追加数据;Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd. 打开文件常用如下语句: if (fp=fopen(file1.dat, r)=NULL) printf (cannot open this file.n); exit ( ); 如果调用fopen()成功,返回一文件类型指针,否则返回一空指针。 其中exit( ) 是个进程控制库函数,其作用是
10、关闭所有文件,终止程序运行。格式为: void exit(int status)Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.fclose-文件关闭函数原型: int fclose(FILE *fp) 如果文件关闭成功,返回0,如检测到任何错误,则返回EOF(即-1,在头文件stdio.h中定义) 任何已经打开的文件在文件使用结束后,应用fclose 函数及时关闭。 程序结束时,程序中打开的所有文件会被自动关闭。E
11、valuation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.9.3 文本文件的输入输出读写一个字符的函数fgetc()和fputc()字符串读写函数-fgets()和fputs()格式化读写函数-fscanf()和fprintf()Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 As
12、pose Pty Ltd.1 读写字符函数1) 读字符函数-fgetc() 格式:int fgetc(FILE *fp) 功能:从一打开的文件中读一个字符,返回该字 符。文件中有一个指向当前位置的指针自动后移 一个字符。反复调用可一直读到文件结束。文件 结束或出错时,返回EOF。 C语言还提供了一个检测文件结束函数: int feof(FILE *fp) 如果文件结束, 返回非0值, 否则返回0。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 A
13、spose Pty Ltd.【例9.1】设计程序读一个源程序文件,并在屏幕上显示。源程序文件名为:“e:hello.c”。# include stdio.hmain( ) FILE *fp; char ch; if(fp=fopen(“e:hello.c,r )=NULL) printf(cannot open this file.n); exit( ); ch=fgetc(fp); while(feof(fp)=0) putchar(ch); ch=fgetc(fp); fclose(fp);Evaluation only.Created with Aspose.Slides for .NE
14、T 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.其中: ch=fgetc(fp); while(feof(fp)=0) putchar(ch); ch=fgetc(fp); 也可写成: while(!feof(fp) ch=fgetc(fp); putchar(ch); 或: while(ch=fgetc(fp)!=EOF) putchar(ch); Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copy
15、right 2004-2011 Aspose Pty Ltd.2)写字符函数fputc()格式:int fputc(char ch, FILE *fp) 功能:将字符 ch 写到fp指向的文件中去,成功,则返回该字符,否则返回EOF。【例9.3】将字符串“Welcome Freshman!”写入e:下名为“file1.txt”的磁盘文件中。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.#include stdio.
16、hmain( ) FILE *fp; char ch;if(fp=fopen(“E:file1.txt,w)=NULL) printf(cannot open this file.n); exit( ); while(ch=getchar( )!=n) fputc(ch,fp); fclose(fp); 运行时输入:运行时输入: Welcome FreshmanEvaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.2 读写
17、字符串函数1) 读字符串函数-fgets() 格式: char *fgets(char *buf, int max, FILE *fp) ; 功能:从fp指定的文件读取长度为max-1的字符串存入起始地址为buf的内存空间,自动加结束标志0,共占n个字符,返回值为地址buf。 若在未读足max-1个字符前遇到换行符n或文件结束就停止读取。若读到文件末尾或出错,则返回NULL值Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty L
18、td.2) 写字符串函数-fputs() 格式: int fputs(char *buf, FILE *fp); 其中buf可以是字符串常量字符串常量,字符数组名字符数组名或字符指针字符指针。 功能:将buf指向的字符串写到fp指定的文件。但不输出字符串结束符。写成功,则返回所写的最后一个字符,否则返回EOF值。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.例例: (填空填空):从键盘上输入一个字符串从键盘上输入一
19、个字符串, ,把其中的小写字母改把其中的小写字母改成大写成大写, ,输出到文件输出到文件t test.txt中中, ,然后从该文件读出此字符然后从该文件读出此字符串并显示。串并显示。#include main( ) FILE *fp; char str100; int i=0; gets(str); if(fp=fopen(test.txt, _ )=NULL) printf(Cant open this file.n); exit(0); while(stri) if(stri=a&stri=z) stri= _ ; fputc(stri,fp); i+; fclose(fp); fp=fo
20、pen(test.txt,_ ); fgets(str,100, fp); printf(%sn, str); fclose(fp); wstri-32rEvaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.【例9.5】 将字符串They decided to meet the following evening. 加密后写入磁盘文件,该文件名为file3.txt。加密算法是将信息字符串每个字符和密钥字符串,唐诗“床前明月
21、光,疑是地上霜,举头望明月”的汉语拼音码相加。解密的方法当然是二者相减。这可从磁盘文件中把密码读到内存后解密验证。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.#include main() FILE *fp; int len, i; char s80=They decided to meet the following evening., char r80=ChuangqianmingyueguangYishid
22、ishangshuangJjutouwang, a80; len=strlen(s); for (i=0; ilen; i+) ai=si+ri; /* 加密运算加密运算 */ ai=0; puts(a); /* 显示密码显示密码 */ fp=fopen(file3.txt, w); fputs(a, fp); /* 写入文件写入文件 */ fclose(fp); fp=fopen(file3.txt, r); fgets(a, len+1, fp); /* 读文件读文件 */ for (i=0; ilen; i+) ai=ai-ri; /* 解密运算解密运算 */ puts(a); /* 显
23、示原信息显示原信息 */Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.3 格式化读写函数调用格式: fscanf ( FILE *fp, 格式说明,输入表列); fprintf ( FILE *fp, 格式说明,输出表列); 这两个函数与scanf( )和printf( ) 相似,只是读写对象不同,前者是文件,后者是终端。Evaluation only.Created with Aspose.Slides for
24、.NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.【例9.6】编程序构成一个九九表,写入文件file4.txt。再从该文件把九九表中的数据读入二维数组a99 #include main() FILE *fp; int i, j, a99; fp=fopen(file4.txt, w); for(i=1; i10; i+) for (j=1; j10; j+) fprintf(fp, %3d, i*j); fprintf(fp, n); fclose(fp); Evaluation only.Created wi
25、th Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.fp=fopen(file4.txt, r); for (i=0; i9; i+) for (j=0; j9; j+) fscanf(fp, %d, &aij); fclose(fp); for (i=0; i9; i+) for (j=0; j9; j+) printf(%3d, aij); printf(n); Evaluation only.Created with Aspose.Slides for .NET 3
26、.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.总结1:辅助函数FILE *fp;打开文件 fp=fopen(“文件名”,“打开方式”);关闭文件 fclose(fp);判断文件是否结束 feof(fp); /*文件结束返回值为1,否则为0*/ EOF /*文件结束标志*/Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.总结2:读写函数一览ch
27、ar c, s80; int max;FILE *fp,*fp1;/*从fp指向的文件读1个字符赋给字符c*/ c=fgetc(fp); /*将字符c写到fp指向的文件中*/ fputc(c,fp); /*从fp指向的文件读max-1个字符写到字符串s中*/ fgets(s,max,fp); /*将字符串s的内容写到fp指向的文件中*/ fputs(s,fp); /*从fp指向的文件中按格式读内容到 变量地址表*/ fscanf(fp,格式控制符,变量地址表);/*将变量表的内容按格式控制符的格式写到fp指向的文件中*/ fprintf(fp,格式控制符,变量表);Evaluation onl
28、y.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.操作对象:终端操作对象:文件 c=getchar() c=fgetc(fp); putchar(c) fputc(fp,c); gets(s); fgets(s,max,fp); puts(s); fputs(s,fp); scanf(“%c”,&c); fscanf(fp,”%c”,&c); printf(“%c”,c); fprintf(fp,”%c”,c); char c,s80; int
29、max; FILE* fp;操作对象不同的两种函数的对比操作对象不同的两种函数的对比Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.9.4 二进制文件的输入输出格式:格式: int fread (void *buf, int size, int n, FILE *fp); int fwrite(void *buf, int size, int n, FILE *fp);其中:其中:void *buf: 任何类型指向数
30、据块任何类型指向数据块(首址首址)的指针,的指针,int size: 要读写的数据块字节数,要读写的数据块字节数,int n: 要读写的数据块个数,要读写的数据块个数,FILE *fp: 指向已打开的指向已打开的要读写要读写文件的指针。文件的指针。 读或写成功,返回读或写数据块个数读或写成功,返回读或写数据块个数Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.例例(填空填空):以下程序把从键盘读入的以下程序把从键盘读
31、入的10个整数个整数 以二进制方式写到一个名为以二进制方式写到一个名为binbin.dat的新文件中。的新文件中。#include FILE *fp;main( ) int i, j; if(fp=fopen( _, wb)=NULL) exit(0); for(i=0; i10; i+) scanf(%d,&j); fwrite(&j, _, 1, _ ); fclose(fp);bin.datsizeof(int)fpEvaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyrigh
32、t 2004-2011 Aspose Pty Ltd.【例9.9】设职工数据为:工号、姓名、性别、年龄、工资,将6名职工的数据从键盘输入,然后送入磁盘文件worker1.rec中保存。再读此文件并输出这些数据,依次打印出来。说明:其实前叙四对对文件的操作函数既可以用于操作文本文件,也可用于操作二进制文件,但fgetc/fputc、fputs/fputs、fscanf/fprintf三对函数更常用于操作文本文件,而fread/fwrite函数更常用于操作二进制文件,这是一种主流用法、直观而方便。Evaluation only.Created with Aspose.Slides for .NET
33、 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.*9.5 其他文件操作函数 1)文件的定位函数 每个文件打开进行读、写操作时,有一个文件指针表明当前文件的读写位置,该指针在读写过程中是自动移动的 C语言库中提供了文件定位函数可对文件的指针进行人工操纵。rewind(FILE* fp);作用是使当前位置指针重新返回文件的开头,程序可对文件重新作读写操作 .Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copy
34、right 2004-2011 Aspose Pty Ltd.fseek()函数 fseek(FILE* fp,位移量位移量,起始点起始点);其中其中“起始点起始点”指位置移动的基准点,它可以是文件指位置移动的基准点,它可以是文件的开始,也可以是文件的当前位置,也可是文件的末的开始,也可以是文件的当前位置,也可是文件的末尾。尾。“位移量位移量”指以指以“起始点起始点”为基准前后移动的字节数,为基准前后移动的字节数,可选可选: SEEK_SET 或或 0 偏移量的起始点为文件开始偏移量的起始点为文件开始SEEK_CUR 或或 1 偏移量的起始点为当前位置偏移量的起始点为当前位置SEEK_END
35、或或 2 偏移量的起始点为文件结尾偏移量的起始点为文件结尾Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.下面是fseek()调用的一些例子,fp是指向文件的指针。fseek(fp, 0L, SEEK_SET); /* 找到文件开始处 */fseek(fp, 20L, SEEK_SET); /* 找到文件的第20个字节*/fseek(fp, 2L, SEEK_CUR); /* 从文件的当前位置向尾部移动2个字节*/f
36、seek(fp, 0L, SEEK_END); /* 找到文件的尾部 */fseek(fp, -10L, SEEK_END); /* 从文件的结尾处退回10个字节*/Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.2) 出错监测函数ftell(FILE* fp)函数 该函数的作用是检测文件的当前位置,其返回值是相对于文件开头的位移量,用长整型表示,文件第一个字节的位移量为0,其余类推。当返回值是-1L时,表示出错。
37、ferror(FILE* fp)函数 监视读写函数是否发生错误,若没有错误,返回0;若发生错误,返回非0。clearerr(FILE* fp)函数 当读写发生错误,ferror()函数返回非0值,需要的话可以调用clearerr()函数,使ferror()的值复0。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.上机实验 91 有一封英文信,其文件名为:letter.txt。统计信中大写字母的个数,句子的总数 (91.c)2.编写程序,将文件e:test2.txt中每一行字符逆序显示在屏幕上。(设每一行不超过80字符) Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.