C语言课件第九章_第1页
C语言课件第九章_第2页
C语言课件第九章_第3页
C语言课件第九章_第4页
C语言课件第九章_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

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

2、区分“字符”与“字节”的不同含义),没有行的概念。 lc语言把计算机系统中的各种设备都抽象成文件。l c文件系统由若干i/o函数组成。 l第一类为标准设备i/o函数(standard i/o) l第二类为标准高级i/o函数(standard high-level i/o) l第三类为低级i/o函数(low-level i/o) 49.3 利用高级利用高级i/o库函数存取文件库函数存取文件l9.3.1 打开文件l9.3.2 读写文件l9.3.3 关闭文件l9.3.4 文件结尾检测与读/写错误检测l9.3.5 文件定位l9.3.6 其他文件操作函数9.3 利用高级利用高级i/o库函数存取文件库函数

3、存取文件 lc程序中利用高级i/o函数读写文件的过程与其他语言中的读写文件的过程是类似的,通常按如下的顺序进行。 打开文件 读写文件 若干次 关闭文件 9.3.1 打开文件打开文件l一般调用形式是:fopen(文件名,存取方式) l“文件名”即为要读写文件的外部名。它可以是字符串、字符数组名、或指向文件名的一个指针,允许包含路径。文件名和路径的形式、要求与c所在的环境有关。如在dos和windows环境下,file1.cpp、 d:cat1cat2file2.cpp a:/file3.cpp都是正确的文件名参数。 9.3.1 打开文件打开文件l“存取方式”也以字符串的形式给出,用来指出如何读写

4、文件。 9.3.1 打开文件打开文件l“存取方式”9.3.1 打开文件打开文件l“存取方式”9.3.1 打开文件打开文件lfopen()函数的返回值l打开文件成功:fopen函数返回给调用者的返回值是一个file型指针(称为“文件指针”),这以后程序中便用这个指针来代替文件的外部名存取文件。 l打开文件失败:fopen函数给调用者返回一个null空指针。 l失败原因:文件不存在、权限不够、磁盘空间不足等。9.3.1 打开文件打开文件lfile结构类型(头文件stdio.h中 )typedef struct short level; /* 用于检查缓冲区满/空 */ unsigned flags

5、; /* 文件状态标志 */ char fd; /* 文件描述符 */ unsigned char hold; /* 如果无缓冲区,退回输入字符 */ short bsize; /* 缓冲区大小 */ unsigned char *buffer; /* 数据传输缓冲区 */ unsigned char *curp; /* 当前活动指针 */ unsigned istemp; /* 临时文件指示符 */ short token; /* 用于合法性检查 */ file;9.3.1 打开文件打开文件l正确的fopen 调用过程 : file *fp; if(fp=fopen(filename,mod

6、e)=null) puts(“cant open file .n”); exit(1); 9.3.1 打开文件打开文件lc文件系统中的标准设备文件 9.3.2 读写文件读写文件l读写字符函数putc和getcl读写字符串函数fgets与fputs l格式化读写函数fscanf与fprintf l二进制读写函数fread与fwrite 9.3.2 读写文件读写文件lgetc函数用来从已打开文件的当前位置读出一个字符。它的调用形式是: getc(fp) lputc函数用来向文件中写一个字符,调用形式是:putc(ch,fp) lputchar和getchar在头文件stdio.h中的实现#defi

7、ne getchar( ) getc(stdin)#define putchar(c) putc(c,stdout) 读写字符函数读写字符函数putc和和getc 9.3.2 读写文件读写文件#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 f

8、ilecopy(fp); fclose(fp); putc和和getc函数的应用函数的应用 int filecopy(file *fp)int c;while(c= getc (fp)!=eof)putc(c, stdout);例例9.1: 复制文件复制文件9.3.2 读写文件读写文件lfgets函数用来从指定的文件中读出一行或一个指定长度的字符串,其调用形式是:fgets(line, n,fp); lline 可以是字符数组名、字符指针名,它是从文件中读出的字符串在程序中的存放处。ln是一个int数,指出从文件中读出的字符串的长度。注意,实际读出的字符个数最多为 n-1个字符。lfp是文件指

9、针,它是读出数据所在的文件。lfgets函数是一个返回值为字符型的指针的函数。在正常情况下该函数返回读出字符串的存放地址,当遇到eof或读出错误时,该函数将返回null。 读写字符串函数读写字符串函数fgets与与fputs9.3.2 读写文件读写文件char *fgets (char *line , int n , file *fp ) int ch; char *str; str=line; while(-n0&(ch=getc(fp)!= eof) if (*str+=ch)=n) break; *str=0 return(ch=eof&str=line)?null:line); fge

10、ts函数的内部处理过程函数的内部处理过程9.3.2 读写文件读写文件l例9.2:利用fgets函数显示指定的文本文件(由命令行参数给定)的内容。 #include int main(int argc , char *argv )file *fp;char str128; /* 读入字符串存放处,每行最多为128个字符 */ if(fp=fopen(argv1, “r”)=null) printf(“can not open file.n”); exit(1); while(!feof(fp) if(fgets(str,126, fp) /* 请思考,为什么用126 */ printf (“%s

11、”,str); fclose (fp);return 0;fgets函数函数运用运用实例实例9.3.2 读写文件读写文件lfputs函数用来向指定的文件中写入一串字符。它的一般调用形式是:fputs(line,fp)l其中参数fp为写入文件的文件指针。line是指定写入文件的字符串,它可以是指向字符串的指针、字符数组名、还可以是括在双引号中的字符串常量。 lfputs函数的返值是一个int型数,当写入成功时返值为0,不成功时返回非0值。 fputs函数函数9.3.2 读写文件读写文件l例9.3:利用fgets函数和fputs函数实现的一个简单的回显程序。 #include int main(v

12、oid) char str20; while(fgets(str,20,stdin)!=null&str0!= n) fputs(str,stdout); return 0 ;fputs函数函数和和fgets函数综合使用函数综合使用9.3.2 读写文件读写文件lfscanf和 fprintf 的调用形式是fscanf(fp,format, input-list)fprintf(fp,format, output-list)lfp为读写文件的指针。lformat是字符串形式的i/o格式说明,它可以是包含有i/o格式说明的字符数组名、字符指针名和字符串常数。linput-list和output-l

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

14、文件 */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 , &v); fprintf(fp, “%st%dn”,string,v); fclose(fp); /* 关闭以写方式打开的文件test */* 以读方式重新打开的文件test */if(fp=fo

15、pen(“a:test”, “r”)=null) puts(“cannot open file a:test !”);exit(1);/* 从文件中读出刚才写入的一个字符串和一个整数 */fscanf(fp, “%s%d”, string, &v); printf(“%st%dn”,string,v); /* 显示到屏幕上*/return 0; fscanf函数、函数、fprintf函数的应用函数的应用9.3.2 读写文件读写文件l二进制i/o:把数据在内存中的存储形式不进行任何转换直接写入文件,反之把原先直接写入文件中的内存存储形式的数据再读回内存。lfread与fwrite函数的调用形式是

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

17、。lfread和fwrite分别用来一次从向指定文件中读写sizecount个字节。它们的返回值是实际读写的数据项个数。 二进制读写函数二进制读写函数fread与与fwrite9.3.2 读写文件读写文件l例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;/* 以二进制写方式打开文件以二进

18、制写方式打开文件test */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 te

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

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

21、了文件末尾一般通过调用feof函数进行。feof函数的一般调用形式是: feof(fp) ;lfeof函数检测到文件结束标志位为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函数判断文件结尾的示例函数判断文件结尾的示例

22、 9.3.4 文件结尾检测与读文件结尾检测与读/写错误检测写错误检测if(in=fopen(argv2, “wb”)=null)printf (“cannot 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 文件结尾检测与读文件结尾检测与读/写错误检测写错误检测lferror函数用来检查文件操作是否出错l若有错返回非0值l否则返回0

23、值。l对于文件的每种操作,如果操作出错都将置文件状态标志flag 中的错误标志位。l为及时发现及处理错误,保证文件操作的正确性,程序中每次调用文件操作函数后应立即调用ferror函数检查本次文件操作是否有错,并执行相应错误处理程序。ferror函数函数9.3.4 文件结尾检测与读文件结尾检测与读/写错误检测写错误检测l对例9.6程序的修改doch=getc(in);if (ferror(in)puts(“find a reading error !”);exit(1); else putc(ch,out);if (ferror(out)puts(“find a writting error !

24、”);exit(1);while(!feof(in); ferror函数函数9.3.5 文件定位文件定位9.3.5 文件定位文件定位l rewind函数的功能是使文件的读写位置指针定位于文件的开头,同时将清除文件的结束标志和错误标志。 l一般调用形式是:rewind(fp);rewind函数函数9.3.5 文件定位文件定位lfseek函数数用来将文件的读写位置指针定位到相对于文件某个位置起的第n个字节处。它的一般调用形式是:fseek (fp , offset , origin);lfp为文件指针。loffset 为long int 型数,是一个位移量,用于指出相对于文件某个位置的字节数。l负

25、值:使文件位置指针从当前位置处向文件开始的方向移动 l正值:使文件位置指针从当前位置处向文件尾的方向移动 lorigin是一个int型数,其值仅能为:l0 相对于文件开始位置l1 相对于当前文件读写位置指针的当前位置l2 相对于文件尾 fseek函数函数9.3.5 文件定位文件定位l例9.7:使用fseek函数、实现文件的随机存取程序例。#include #include int main(void)file *fp;int i ,info , newnumber , oldnumber = 125 ,array5; int resultfile21;const char *file = ra

26、ndomfile.dat;if(fp=fopen(file, “wb+”)=null) fprintf(stderr, “cannot open file %s.n”,file);exit(1); fseek函数函数9.3.5 文件定位文件定位 /* 以二进制方式向文件randomfile.dat中写入20个整型数 */ for(i=0;i20; i+) fwrite(&i, sizeof(int), 1,fp); /* 把文件读写位置指针定位到第7个整型数的存储位置 */ fseek(fp,6*sizeof(int),0); /* 从文件当前读写位置读出一个整型数(即6),赋给变量info

27、*/ fread(&info,sizeof(int),1,fp); /* 把第10个数改为 125 */ fseek(fp,2*sizeof(int),1); fwrite(&oldnumber ,sizeof(int),1, fp); /* 把刚写入的第10个数(即125)读出,赋给变量newnumber */ fseek(fp, -1*sizeof(int), 1); fread(&newnumber, sizeof(int), 1, fp); /* 把从第11个数起的5个数,读入到数组array中 */ fread(array, sizeof(int), 5, fp); fseek函数函数例例9.79.3.5 文件定位文件定位 /* 在第15个数后插入一个新的数 6 */ fread(resultfile, sizeof(int), 6, fp);fseek(fp, -5* sizeof(int), 2);fwrite(&info, sizeof(int), 1, fp);fwrite(resultfile, sizeof(int), 6, fp); /* 把处理后的整个文件内容读入到数组resultfile中,并在显示器上显示 *

温馨提示

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

评论

0/150

提交评论