C语言课件第九章.ppt

上传人:本田雅阁 文档编号:3479955 上传时间:2019-09-01 格式:PPT 页数:48 大小:874.52KB
返回 下载 相关 举报
C语言课件第九章.ppt_第1页
第1页 / 共48页
C语言课件第九章.ppt_第2页
第2页 / 共48页
C语言课件第九章.ppt_第3页
第3页 / 共48页
C语言课件第九章.ppt_第4页
第4页 / 共48页
C语言课件第九章.ppt_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《C语言课件第九章.ppt》由会员分享,可在线阅读,更多相关《C语言课件第九章.ppt(48页珍藏版)》请在三一文库上搜索。

1、第9章 文件操作,1,主要内容,9.1 文件概念 9.2 C文件系统 9.3 利用高级I/O库函数存取文件,2,9.1 文件概念,从文件的组织形式来看,有顺序文件和索引文件。 从文件的存取方式看,有顺序存取文件和随机存取文件。 从文件内容的表示形式来看,有二进制文件和文本文件等。 文件有各种属性,基本的属性有只读、只写、可读可写。,3,9.2 C文件系统,C语言把每一个文件都看成一个连续的、有序的谓之“流”(stream)的字节序列,流中的每一个字节都可以单独存取。 文本流是一种以行为单位组织的字符序列,行以特定字符结束。 二进制流是一种字节序列(请注意区分“字符”与“字节”的不同含义),没有

2、行的概念。 C语言把计算机系统中的各种设备都抽象成文件。 C文件系统由若干I/O函数组成。 第一类为标准设备I/O函数(standard I/O) 第二类为标准高级I/O函数(standard high-level I/O) 第三类为低级I/O函数(low-level I/O),4,9.3 利用高级I/O库函数存取文件,9.3.1 打开文件 9.3.2 读写文件 9.3.3 关闭文件 9.3.4 文件结尾检测与读/写错误检测 9.3.5 文件定位 9.3.6 其他文件操作函数,9.3 利用高级I/O库函数存取文件,C程序中利用高级I/O函数读写文件的过程与其他语言中的读写文件的过程是类似的,通

3、常按如下的顺序进行。 打开文件 读写文件 若干次 关闭文件 ,9.3.1 打开文件,一般调用形式是: fopen(文件名,存取方式) “文件名”即为要读写文件的外部名。它可以是字符串、字符数组名、或指向文件名的一个指针,允许包含路径。文件名和路径的形式、要求与C所在的环境有关。如在DOS和Windows环境下,file1.cpp、 d:cat1cat2file2.cpp a:/file3.cpp都是正确的文件名参数。,9.3.1 打开文件,“存取方式”也以字符串的形式给出,用来指出如何读写文件。,9.3.1 打开文件,“存取方式”,9.3.1 打开文件,“存取方式”,9.3.1 打开文件,fo

4、pen()函数的返回值 打开文件成功:fopen函数返回给调用者的返回值是一个FILE型指针(称为“文件指针”),这以后程序中便用这个指针来代替文件的外部名存取文件。 打开文件失败:fopen函数给调用者返回一个NULL空指针。 失败原因:文件不存在、权限不够、磁盘空间不足等。,9.3.1 打开文件,FILE结构类型(头文件stdio.h中 ) typedef struct short level; /* 用于检查缓冲区满/空 */ unsigned flags; /* 文件状态标志 */ char fd; /* 文件描述符 */ unsigned char hold; /* 如果无缓冲区,退

5、回输入字符 */ short bsize; /* 缓冲区大小 */ unsigned char *buffer; /* 数据传输缓冲区 */ unsigned char *curp; /* 当前活动指针 */ unsigned istemp; /* 临时文件指示符 */ short token; /* 用于合法性检查 */ FILE;,9.3.1 打开文件,正确的fopen调用过程 : FILE *fp; if(fp=fopen(filename,mode)=NULL) puts(“Cant open file .n”); exit(1); ,9.3.1 打开文件,C文件系统中的标准设备文件,

6、9.3.2 读写文件,读写字符函数putc和getc 读写字符串函数fgets与fputs 格式化读写函数fscanf与fprintf 二进制读写函数fread与fwrite,9.3.2 读写文件,getc函数用来从已打开文件的当前位置读出一个字符。它的调用形式是: getc(fp) putc函数用来向文件中写一个字符,调用形式是: putc(ch,fp) putchar和getchar在头文件stdio.h中的实现 #define getchar( ) getc(stdin) #define putchar(c) putc(c,stdout),读写字符函数putc和getc,9.3.2 读写

7、文件,#include int main (int argc , char *argv ) FILE *fp; int filecopy (FILE *fp); if(argc=1) filecopy(stdin); else while(-argc0) if(fp=fopen(*+argv, “r”)=NULL) printf (“cant open %sn”, *argv); exit(1); else filecopy(fp); fclose(fp); ,putc和getc函数的应用,int filecopy(FILE *fp) int c; while(c= getc (fp)!=EO

8、F) putc(c, stdout); ,例9.1: 复制文件,9.3.2 读写文件,fgets函数用来从指定的文件中读出一行或一个指定长度的字符串,其调用形式是: fgets(line, n,fp); line 可以是字符数组名、字符指针名,它是从文件中读出的字符串在程序中的存放处。 n是一个int数,指出从文件中读出的字符串的长度。注意,实际读出的字符个数最多为 n-1个字符。 fp是文件指针,它是读出数据所在的文件。 fgets函数是一个返回值为字符型的指针的函数。在正常情况下该函数返回读出字符串的存放地址,当遇到EOF或读出错误时,该函数将返回NULL。,读写字符串函数fgets与fp

9、uts,9.3.2 读写文件,char *fgets (char *line , int n , FILE *fp ) int ch; char *str; str=line; while(-n0 ,fgets函数的内部处理过程,9.3.2 读写文件,例9.2:利用fgets函数显示指定的文本文件(由命令行参数给定)的内容。 #include int main(int argc , char *argv ) FILE *fp; char str128; /* 读入字符串存放处,每行最多为128个字符 */ if(fp=fopen(argv1, “r”)=NULL) printf(“Can no

10、t open file.n”); exit(1); while(!feof(fp) if(fgets(str,126, fp) /* 请思考,为什么用126 */ printf (“%s”,str); fclose (fp); return 0; ,fgets函数运用实例,9.3.2 读写文件,fputs函数用来向指定的文件中写入一串字符。它的一般调用形式是: fputs(line,fp) 其中参数fp为写入文件的文件指针。line是指定写入文件的字符串,它可以是指向字符串的指针、字符数组名、还可以是括在双引号中的字符串常量。 fputs函数的返值是一个int型数,当写入成功时返值为0,不成功

11、时返回非0值。,fputs函数,9.3.2 读写文件,例9.3:利用fgets函数和fputs函数实现的一个简单的回显程序。 #include int main(void) char str20; while(fgets(str,20,stdin)!=NULL ,fputs函数和fgets函数综合使用,9.3.2 读写文件,fscanf和 fprintf的调用形式是 fscanf(fp,format, input-list) fprintf(fp,format, output-list) fp为读写文件的指针。 format是字符串形式的I/O格式说明,它可以是包含有I/O格式说明的字符数组名

12、、字符指针名和字符串常数。 input-list和output-list分别是输入项表和输出项表。 fscanf函数返回实际赋值的变元数(不包含被压缩或跳过的字段),输入操作出错则返回EOF。 fprintf函数的返回值是实际写出的字符数,若出错则返回负值。,格式化读写函数fscanf与fprintf,9.3.2 读写文件,例9.4:程序先从键盘上读入一个字符串和一个整数,然后将它们以文本的形式写入到软盘的test的文件中,最后再从软盘的test文件中读出并显示到屏幕上。,fscanf函数、fprintf函数的应用,#include #include #include /* 使用exit函数需

13、要该头文件 */ int main(void) FILE *fp; char string80; int v; if(fp=fopen(“a:test”, “w”)=NULL) puts(“Cannot open file a:test !”); exit(1); ,9.3.2 读写文件,puts(“Enter a string and a number:”); scanf(“%s%d”, string , ,fscanf函数、fprintf函数的应用,9.3.2 读写文件,二进制I/O:把数据在内存中的存储形式不进行任何转换直接写入文件,反之把原先直接写入文件中的内存存储形式的数据再读回内存

14、。 fread与fwrite函数的调用形式是: fwrite(buf,size,count,fp) fread(buf,size,count,fp),二进制读写函数fread与fwrite,9.3.2 读写文件,buf是读写数据在内存中的存放处,通常为数组名或指针。 对fwrite而言,buf中存放的内容就是要写入到文件中去的数据; 对fread而言,从文件中读出的数据被存放到指定的buf中。 size通常为unsigned int型数(不同的系统实现可能不同,这无关紧要),指出读写的数据项的长度(以字节为单位)。 count通常也为unsigned int型数,用来指出读写数据项的个数。 f

15、p是读写文件的文件指针。 fread和fwrite分别用来一次从向指定文件中读写sizecount个字节。它们的返回值是实际读写的数据项个数。,二进制读写函数fread与fwrite,9.3.2 读写文件,例9.5:先使用fwrite以二进制方式一次向文件中写入8个数据,然后使用fread以二进制方式从文件中一次读出多个数据项。,fread和fwrite函数的应用,#include #include int main(void) FILE *fp; float f =1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8, bal8; int i; /* 以二进制写方式打开文件test

16、 */ if(fp=fopen(“test”, “wb”)=NULL) printf(“Cannot open file test!n”); exit(1); ,9.3.2 读写文件,/* 把存储在数组f中的8个float型数一次性写入文件test */ fwrite(f, sizeof(float), 8, fp); fclose(fp); /* 关闭以二进制写方式打开的文件test */ /* 以二进制读方式重新打开文件test ,以便从文件中读 */ if(fp=fopen(“test”, “rb”)=NULL) printf(“Cannot open file test!n”); ex

17、it (1); /* 从文件test中一次性读出8个float型数,并顺序存储到数组bal中 */ if(fread(bal, sizeof(float), 8,fp)!=8) if ( feof(fp) ) /* 这条语句判别是否遇到文件尾,还是读出错误 */ printf (“End of filen”); else printf (“Read file errorn”); for(i=0;i8;i+) printf(“%fn”,bali); ,fread和fwrite函数的应用,9.3.2 读写文件,二进制文件与文本文件 文件的格式化读写与二进制读写,9.3.3 关闭文件,关闭文件是打开

18、文件的逆操作,它切断文件描述符、文件指针、文件外部名之间的联系。 关闭文件是通过调用fclose函数进行的,它的调用形式是: fclose (fp); 需要程序员关闭文件的原因: 操作系统允许程序同时打开的文件个数是有限的,为了能同时打开更多的文件,不再使用的文件应及时关闭; 在写入文件的情况下,数据不是直接写到文件上去的,而是先写到文件读写缓冲区中,若系统发生非正常情况(死机或断电),当前缓冲区中的未写到盘上的内容就可能丢失掉了 。,9.3.4 文件结尾检测与读/写错误检测,程序中判断文件是否已到了文件末尾一般通过调用feof函数进行。feof函数的一般调用形式是: feof(fp) ; f

19、eof函数检测到文件结束标志位为1则返回非0值,否则返回0值。,9.3.4 文件结尾检测与读/写错误检测,#include #include int main(int argc,char *argv ) FILE *in , *out; char ch; if(in=fopen(argv1, “rb”)=NULL) printf(“Cannot open %s file!n”, argv1); exit(1); ,例9.6:利用feof函数判断文件结尾的示例,9.3.4 文件结尾检测与读/写错误检测,if(in=fopen(argv2, “wb”)=NULL) printf (“Cannot

20、open %s file!n”, argv2); exit (1); while(!feof(in) ) ch=getc(in); if(!feof(in) putc(ch,out); fclose(in); fclose(out); return 0; ,利用feof函数判断文件结尾的示例,9.3.4 文件结尾检测与读/写错误检测,ferror函数用来检查文件操作是否出错 若有错返回非0值 否则返回0值。 对于文件的每种操作,如果操作出错都将置文件状态标志flag 中的错误标志位。 为及时发现及处理错误,保证文件操作的正确性,程序中每次调用文件操作函数后应立即调用ferror函数检查本次文件

21、操作是否有错,并执行相应错误处理程序。,ferror函数,9.3.4 文件结尾检测与读/写错误检测,对例9.6程序的修改 do ch=getc(in); if (ferror(in) puts(“Find a reading error !”); exit(1); else putc(ch,out); if (ferror(out) puts(“Find a writting error !”); exit(1); while(!feof(in); ,ferror函数,9.3.5 文件定位,9.3.5 文件定位,rewind函数的功能是使文件的读写位置指针定位于文件的开头,同时将清除文件的结束

22、标志和错误标志。 一般调用形式是: rewind(fp);,rewind函数,9.3.5 文件定位,fseek函数数用来将文件的读写位置指针定位到相对于文件某个位置起的第n个字节处。它的一般调用形式是: fseek (fp , offset , origin); fp为文件指针。 offset 为long int 型数,是一个位移量,用于指出相对于文件某个位置的字节数。 负值:使文件位置指针从当前位置处向文件开始的方向移动 正值:使文件位置指针从当前位置处向文件尾的方向移动 origin是一个int型数,其值仅能为: 0 相对于文件开始位置 1 相对于当前文件读写位置指针的当前位置 2 相对于

23、文件尾,fseek函数,9.3.5 文件定位,例9.7:使用fseek函数、实现文件的随机存取程序例。 #include #include int main(void) FILE *fp; int i ,info , newnumber , oldnumber = 125 ,array5; int resultfile21; const char *file = “randomfile.dat“; if(fp=fopen(file, “wb+”)=NULL) fprintf(stderr, “Cannot open file %s.n”,file); exit(1); ,fseek函数,9.3

24、.5 文件定位,/* 以二进制方式向文件randomfile.dat中写入20个整型数 */ for(i=0;i20; i+) fwrite(,fseek函数例9.7,9.3.5 文件定位,/* 在第15个数后插入一个新的数 6 */ fread(resultfile, sizeof(int), 6, fp); fseek(fp, -5* sizeof(int), 2); fwrite( ,fseek函数例9.7,9.3.5 文件定位,ftell函数返回文件的当前读写位置值。 该值是一个long 整型数 对二进制流是从文件开始计算的字节数; 对文本流给出的位置值可能不准确,因为可能发生文件行结

25、束符的转换,会影响文件的大小。 ftell函数只适用于以二进制方式打开的文件。,ftell函数,9.3.6 其他文件操作函数,9.3.6 其他文件操作函数,fflush函数的功能是刷新缓冲区(flushing buffer)。 对于写打开的文件,把输出缓冲区的信息写入文件 对于读打开的文件,则清除输入缓冲区中的内容 fflush函数的一般使用形式是: fflush(fp); 操作成功返回0值,否则返回EOF。,fflush函数,9.3.6 其他文件操作函数,例9.9:用getchar等函数输入数据时,使用fflush函数清除stdin ,以便能获得正确的输入数据。 #include int main(void) char c; int b; scanf (“%d”, ,fflush函数的使用,9.3.6 其他文件操作函数,remove函数用来删除指定的文件。 一般使用形式是: remove(文件名); 删除成功返回0,否则返回非0。,fremove函数,9.3.6 其他文件操作函数,例9.10:删除指定的文件。 #include int main(void) char filename80; printf (“Enter filename:”); gets(filename); remove(filename); return 0; ,fremove函数的使用,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1