版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第9章章 文件操作文件操作 1主要内容主要内容l9.1 文件概念文件概念l9.2 C文件系统文件系统l9.3 利用高级利用高级I/O库函数存取文件库函数存取文件 29.1 文件概念文件概念 l从文件的组织形式来看,有顺序文件和索引文从文件的组织形式来看,有顺序文件和索引文件。件。 l从文件的存取方式来看,有顺序存取文件和随从文件的存取方式来看,有顺序存取文件和随机存取文件。机存取文件。 l从文件内容的表示形式来看,有二进制文件和从文件内容的表示形式来看,有二进制文件和正文文件等。正文文件等。 l文件有各种属性,基本的属性有只读、只写、文件有各种属性,基本的属性有只读、只写、可读可写。可读可写
2、。 39.2 C文件系统文件系统lC语言把每一个文件都看成一个连续的、有序的谓之语言把每一个文件都看成一个连续的、有序的谓之“流流”(stream)的字节序列,流中的每一个字节都可的字节序列,流中的每一个字节都可以单独存取。以单独存取。 l正文流是一种以行为单位组织的字符序列,行以特定字符结正文流是一种以行为单位组织的字符序列,行以特定字符结束。束。 l二进制流是一种字节序列(请注意区分二进制流是一种字节序列(请注意区分“字符字符”与与“字节字节”的不同含义),没有行的概念。的不同含义),没有行的概念。 lC语言把计算机系统中的各种设备都抽象成文件。语言把计算机系统中的各种设备都抽象成文件。l
3、 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.2 关闭文件关闭文件l9.3.4 文件结尾检测与读文件结尾检测与读/写错误检测写错误检测l9.3.5 文件定位文件定位l9.3.6 * 其他文件操作函数其他文
4、件操作函数9.3 利用高级利用高级I/O库函数存取文件库函数存取文件 lC程序中利用高级程序中利用高级I/O函数读写文件的过程与其他语言函数读写文件的过程与其他语言中的读写文件的过程是类似的,通常按如下的顺序进中的读写文件的过程是类似的,通常按如下的顺序进行。行。 打开文件打开文件 读写文件读写文件 若干次若干次 关闭文件关闭文件 9.3.1 打开文件打开文件l一般调用形式是:一般调用形式是:fopen(文件名文件名,存取方式存取方式) l“文件名文件名”即为要读写文件的外部名。它可以即为要读写文件的外部名。它可以是字符串、字符数组名、或指向文件名的一个是字符串、字符数组名、或指向文件名的一个
5、指针,允许包含路径。文件名和路径的形式、指针,允许包含路径。文件名和路径的形式、要求与要求与C所在的环境有关。如在所在的环境有关。如在DOS和和Windows环境下,环境下,file1.c、 d:cat1cat2file2.c 都是正确的文件名参数。都是正确的文件名参数。 9.3.1 打开文件打开文件l“存取方式存取方式”也以字符串的形式给出,用来指出也以字符串的形式给出,用来指出如何读写文件。如何读写文件。 方方 式式含含 义义使使 用用 说说 明明 与与 要要 求求“r”r”打开且只读正打开且只读正文文件文文件文件必须存在,且只能读文件。文件必须存在,且只能读文件。“w”w”打开且只写正打
6、开且只写正文文件文文件若文件不存在则建立之。若文件若文件不存在则建立之。若文件存在则先删除该文件,再重存在则先删除该文件,再重新建立之。新建立之。“a”a”打开仅追加正打开仅追加正文文件文文件向已有文件的尾部追加内容,若向已有文件的尾部追加内容,若文件不存在则建立之。文件不存在则建立之。9.3.1 打开文件打开文件l“存取方式存取方式”“r+”r+”打开读打开读/ /写正文文写正文文件件文件必须存在且具有写许可权,不删除文文件必须存在且具有写许可权,不删除文件已有内容。可从文件中读取内容,件已有内容。可从文件中读取内容,也可更新、写入新内容。也可更新、写入新内容。“w+”w+”打开读打开读/
7、/写正文文写正文文件件若文件不存在则建立之,若文件存在则先若文件不存在则建立之,若文件存在则先删除该文件,再重新建立之。可先向删除该文件,再重新建立之。可先向文件写入内容,然后可从文件中读取文件写入内容,然后可从文件中读取已有内容,也可更新、写入新内容。已有内容,也可更新、写入新内容。“a+”a+”打开读打开读/ /写正文文写正文文件件可从文件中读取内容,也可向文件中写入可从文件中读取内容,也可向文件中写入内容,但写入时只能在文件的尾部追内容,但写入时只能在文件的尾部追加内容。若文件不存在则先建立之。加内容。若文件不存在则先建立之。9.3.1 打开文件打开文件l“存取方式存取方式”9.3.1
8、打开文件打开文件lfopen()函数的返回值函数的返回值l打开文件成功:打开文件成功:fopen函数返回给调用者的返回值是函数返回给调用者的返回值是一个一个FILE型指针(称为型指针(称为“文件指针文件指针”),这以后程),这以后程序中便用这个指针来代替文件的外部名存取文件。序中便用这个指针来代替文件的外部名存取文件。 l打开文件失败:打开文件失败:fopen函数给调用者返回一个函数给调用者返回一个NULL空指针。空指针。 l失败原因:文件不存在、权限不够、磁盘空间不足等。失败原因:文件不存在、权限不够、磁盘空间不足等。9.3.1 打开文件打开文件lFILE结构类型结构类型(头文件头文件std
9、io.h中中 )typedef struct short level; /* 用于检查缓冲区满用于检查缓冲区满/空空 */ unsigned flags; /* 文件状态标志文件状态标志 */ char fd; /* 文件描述符文件描述符 */ unsigned char hold; /* 如果无缓冲区,退回输入字符如果无缓冲区,退回输入字符 */ short bsize; /* 缓冲区大小缓冲区大小 */ unsigned char *buffer; /* 数据传输缓冲区数据传输缓冲区 */ unsigned char *curp; /* 当前活动指针当前活动指针 */ unsigned i
10、stemp; /* 临时文件指示符临时文件指示符 */ short token; /* 用于合法性检查用于合法性检查 */ FILE;9.3.1 打开文件打开文件l正确的正确的fopen 调用过程调用过程 : FILE *fp; if(fp=fopen(filename,mode)=NULL) puts(“Cant open file .n”); exit(1); /*stdlib.h*/ 9.3.1 打开文件打开文件lC文件系统中的标准设备文件文件系统中的标准设备文件 9.3.2 读写文件读写文件l读写字符函数读写字符函数getc和和 putcl格式化读写函数格式化读写函数fscanf与与f
11、printfl读写字符串函数读写字符串函数fgets与与fputs l二进制读写函数二进制读写函数fread与与fwrite 9.3.2 读写文件读写文件lgetc函数用来从已打开文件的当前位置读出一函数用来从已打开文件的当前位置读出一个字符。它的调用形式是:个字符。它的调用形式是: getc(fp) lputc函数用来向文件中写一个字符,调用形式函数用来向文件中写一个字符,调用形式是:是:putc(ch,fp) lputchar和和getchar在头文件在头文件stdio.h中的实现中的实现#define getchar( ) getc(stdin)#define putchar(c) pu
12、tc(c,stdout)fgetc(fp) 、fputc(ch,fp) 读写字符函数读写字符函数getc和和putc9.3.2 读写文件读写文件#include int main ( ) FILE *fp;char s80,ch; gets(s); if(fp=fopen(s, “r”)=NULL) printf (“cant open %sn”, s); return; else ch=getc(fp); putc(ch,stdout); fclose(fp); putc和和getc函数的应用函数的应用9.3.2 读写文件读写文件#include #include int main (int
13、 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)!=EOF)putc(c, stdout);例例9.
14、1: 利用利用putc和和getc函数实现从键盘或若干个文件中读出数据并显示到函数实现从键盘或若干个文件中读出数据并显示到屏幕上的程序。屏幕上的程序。 9.3.2 读写文件读写文件lfgets函数用来从指定的文件中读出一行或一个指定长函数用来从指定的文件中读出一行或一个指定长度的字符串,其调用形式是:度的字符串,其调用形式是:fgets(line, n,fp); lline 可以是字符数组名、字符指针变量名,它是从文可以是字符数组名、字符指针变量名,它是从文件中读出的字符串在程序中的存放处。件中读出的字符串在程序中的存放处。ln是一个是一个int型数,指出从文件中读出的型数,指出从文件中读出的
15、n-1个字符,添个字符,添一个一个0字符,把字符,把n个字符放到字符数组个字符放到字符数组string中。中。lfp是文件指针,它是读出数据所在的文件。是文件指针,它是读出数据所在的文件。lfgets函数是一个返回值为字符型的指针的函数。在正函数是一个返回值为字符型的指针的函数。在正常情况下该函数返回读出字符串的存放地址,当遇到常情况下该函数返回读出字符串的存放地址,当遇到EOF或读出错误时,该函数将返回或读出错误时,该函数将返回NULL。 读写字符串函数读写字符串函数fgets与与fputs9.3.2 读写文件读写文件l例例9.2:利用:利用fgets函数显示指定的正文文件的内容。函数显示指
16、定的正文文件的内容。 #include #include int main(void)FILE *fp;char str20; if(fp=fopen(“a.txt”, “r”)=NULL) printf(“Can not open file.n”); exit(1); while(!feof(fp) if(fgets(str,20, fp) printf (“%s”,str); fclose (fp);return 0;fgets函数函数运用运用实例实例9.3.2 读写文件读写文件lfputs函数用来向指定的文件中写入一串字符函数用来向指定的文件中写入一串字符。它的一般调用形式是:。它的一般
17、调用形式是:fputs(line,fp)l其中参数其中参数fp为写入文件的文件指针。为写入文件的文件指针。line是指是指定写入文件的字符串。定写入文件的字符串。l字符串末尾的字符串末尾的0不输出不输出lfputs函数的返值是一个函数的返值是一个int型数,当写入成功型数,当写入成功时返值为时返值为0,不成功时返回非,不成功时返回非0值。值。 fputs函数函数9.3.2 读写文件读写文件l例例9.3:利用:利用fgets函数和函数和fputs函数实现的一个简单的函数实现的一个简单的回显程序。回显程序。 #include int main(void) char str20; while(fge
18、ts(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格式说明。格式说明。linput-list和和output-list分别是输入项表和输出项表。分别是输入项表和输出项表。
19、 格式化读写函数格式化读写函数fscanf与与fprintf9.3.2 读写文件读写文件l例例9.4:程序先从键盘上读入一个字符串和一个整数,然后将它们:程序先从键盘上读入一个字符串和一个整数,然后将它们以正文的形式写入到以正文的形式写入到d盘的盘的test的文件中,最后再从的文件中,最后再从d盘的盘的test文件文件中读出并显示到屏幕上。中读出并显示到屏幕上。 fscanf函数、函数、fprintf函数的应用函数的应用#include #include #include /* 使用使用exit函数需要该头文件函数需要该头文件 */int main(void) FILE *fp; char s
20、tring80; int v;if(fp=fopen(“d:test”, “w”)=NULL) puts(“Cannot open file d: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); if(fp=fopen(“d:test”, “r”)=NULL) puts(“Cannot open file a:test !”);exit(1);fscanf(f
21、p, “%s%d”, string, &v); printf(“%st%dn”,string,v); fclose(fp); return 0; fscanf函数、函数、fprintf函数的应用函数的应用9.3.2 读写文件读写文件l二进制二进制I/O:把数据在内存中的存储形式不进:把数据在内存中的存储形式不进行任何转换直接写入文件,反之把原先直接写行任何转换直接写入文件,反之把原先直接写入文件中的内存存储形式的数据再读回内存。入文件中的内存存储形式的数据再读回内存。lfread与与fwrite函数的调用形式是:函数的调用形式是:fwrite(buf,size,count,fp)fread(b
22、uf,size,count,fp) 二进制读写函数二进制读写函数fread与与fwrite9.3.2 读写文件读写文件lbuf是读写数据在内存中的存放处,通常为数组名或指是读写数据在内存中的存放处,通常为数组名或指针。针。l对对fwrite而言,而言,buf 中存放的内容就是要写入到文件中去的数据中存放的内容就是要写入到文件中去的数据;l对对fread而言,从文件中读出的数据被存放到指定的而言,从文件中读出的数据被存放到指定的buf中。中。lsize通常为通常为unsigned int型数(不同的系统实现可能不同,型数(不同的系统实现可能不同,这无关紧要),指出读写的数据项的长度(以字节为单这
23、无关紧要),指出读写的数据项的长度(以字节为单位)。位)。lcount 通常也为通常也为unsigned int型数,用来指出读写数据型数,用来指出读写数据项的个数。项的个数。lfp是读写文件的文件指针。是读写文件的文件指针。lfread和和fwrite分别用来一次从向指定文件中读写分别用来一次从向指定文件中读写sizecount个字节。它们的返回值是实际读写的数据项个字节。它们的返回值是实际读写的数据项个数。个数。 二进制读写函数二进制读写函数fread与与fwrite9.3.2 读写文件读写文件l例例9.5:先使用:先使用fwrite以二进制方式一次向文件中写入以二进制方式一次向文件中写入
24、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 */if(fp=fopen(“test”, “wb”)=NULL) printf(“Cannot open file test!n”);exit(1); 9.3.2 读写文件读写文
25、件/* 把存储在数组把存储在数组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”);exit (1); /* 从文件从文件test中一次性读出中一次性读出8个个float
26、型数,并顺序存储到数组型数,并顺序存储到数组bal中中 */if(fread(bal, sizeof(float), 8,fp)!=8)if ( feof(fp) ) /* 这条语句判别是否遇到文件尾,还是读出错误这条语句判别是否遇到文件尾,还是读出错误 */printf (“End of filen”);elseprintf (“Read file errorn”);else for(i=0;i8;i+) printf(“%fn”,bali); fclose(fp); fread和和fwrite函数的应用函数的应用9.3.2 读写文件读写文件二进制文件与二进制文件与正文文件正文文件文件的格式
27、化读写与二进制读写文件的格式化读写与二进制读写9.3.3 关闭文件关闭文件l关闭文件是打开文件的逆操作,关闭文件是打开文件的逆操作, 它切断文件描述符它切断文件描述符、文件指针、文件外部名之间的联系。、文件指针、文件外部名之间的联系。 l关闭文件是通过调用关闭文件是通过调用fclose函数进行的,它的调用形函数进行的,它的调用形式是:式是:fclose (fp);l需要程序员关闭文件的原因:需要程序员关闭文件的原因:l操作系统允许程序同时打开的文件个数是有限的,为了能同操作系统允许程序同时打开的文件个数是有限的,为了能同时打开更多的文件,不再使用的文件应及时关闭时打开更多的文件,不再使用的文件
28、应及时关闭;l在写入文件的情况下,数据不是直接写到文件上去的,而是在写入文件的情况下,数据不是直接写到文件上去的,而是先写到文件读写缓冲区中,若系统发生非正常情况(死机先写到文件读写缓冲区中,若系统发生非正常情况(死机或断电),当前缓冲区中的未写到盘上的内容就可能丢失掉或断电),当前缓冲区中的未写到盘上的内容就可能丢失掉了了 。9.3.4 文件结尾检测与读文件结尾检测与读/写错误检测写错误检测l程序中判断文件是否已到了文件末尾一般通过程序中判断文件是否已到了文件末尾一般通过调用调用feof函数进行。函数进行。feof函数的一般调用形式函数的一般调用形式是:是: feof(fp) ;lfeof函
29、数检测到文件结束标志位为函数检测到文件结束标志位为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 文件结尾检测与读文件结尾检测与读/写错误
30、检测写错误检测if(out=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值
31、。值。l对于文件的每种操作,如果操作出错都将置文对于文件的每种操作,如果操作出错都将置文件状态标志件状态标志flag 中的错误标志位。中的错误标志位。l为及时发现及处理错误,保证文件操作的正确为及时发现及处理错误,保证文件操作的正确性,程序中每次调用文件操作函数后应立即调性,程序中每次调用文件操作函数后应立即调用用ferror函数检查本次文件操作是否有错,并函数检查本次文件操作是否有错,并执行相应错误处理程序。执行相应错误处理程序。ferror函数函数9.3.4 文件结尾检测与读文件结尾检测与读/写错误检测写错误检测l例如例如doch=getc(in);if (ferror(in)puts(“
32、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 文件定位文件定位l rewind函数的功能是使文件的读写位置指针函数的功能是使文件的读写位置指针定位于文件的开头,同时将清除文件的结束标定位于文件的开头,同时将清除文件的结束标志和错误标志。志和错误标志。 l一般调用形式是:一般调用形式是:rewind(fp);rewind函数函数9.3.5
33、 文件定位文件定位lfseek函数数用来将文件的读写位置指针定位到相对于函数数用来将文件的读写位置指针定位到相对于文件某个位置起的第文件某个位置起的第n个字节处。它的一般调用形式个字节处。它的一般调用形式是:是:fseek (fp , offset , origin);lfp为文件指针。为文件指针。loffset 为为long int 型数,是一个位移量,用于指出相对于文件型数,是一个位移量,用于指出相对于文件某个位置的字节数。某个位置的字节数。l负值:使文件位置指针从当前位置处向文件开始的方向移动负值:使文件位置指针从当前位置处向文件开始的方向移动 l正值:使文件位置指针从当前位置处向文件尾
34、的方向移动正值:使文件位置指针从当前位置处向文件尾的方向移动 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 ,arr
35、ay5; int resultfile21;const char *file = randomfile.dat;if(fp=fopen(file, “wb+”)=NULL) fprintf(stderr, “Cannot open file %s.n”,file);exit(1); for(i=0;i20; i+) fwrite(&i, sizeof(int), 1,fp); fseek函数函数9.3.5 文件定位文件定位 fseek(fp,6*sizeof(int),0); fread(&info,sizeof(int),1,fp); fseek(fp,2*sizeof(int),1); fwrite(&oldnumber ,sizeof(int),1, fp); fseek(fp, -1*sizeof(int), 1); fread(&newnumber, sizeof(int), 1, fp); fread(array, sizeof(int), 5, fp); fseek函数函数例例9.79.3.5 文件定位文件定位fread(resultfile, sizeof(int), 5, fp);fseek(fp, -5* sizeof(int), 2);fwrite(&info, sizeof(int), 1, fp);fwrite(resultfile, sizeof(in
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 内蒙古自治区锡林郭勒盟三县联考2024-2025学年八年级上学期1月期末物理试题(无答案)
- 保安员竞赛理论知识考试试题题库及答案
- 2025年度厂房租赁合同书(含环保验收条款)3篇
- 【产业图谱】2024年江阴市重点产业规划布局全景图谱(附产业现状、产业布局、产业发展规划等)
- 2024小班幼儿的评语(33篇)
- 2024版期货融资居间合同协议范本
- 2024铁精粉仓储物流服务合同样本3篇
- 福建省南平市九三英华高级中学高一化学模拟试卷含解析
- 2025年度存量房租赁市场调控合作协议3篇
- 2024版安全生产与环境保护综合管理协议
- 大学生心理健康教育常见困扰与自我调适智慧树知到期末考试答案章节答案2024年浙江师范大学
- 工程资金监管协议范本
- 行测言语理解与表达真题及完整答案1套
- 肥尾效应(前渐进论、认识论和应用)
- 小学美术课堂案例分析
- 2024蒸压硅酸盐功能骨料在混凝土中应用技术规程
- 企业管理干股入股合作协议书
- 2024年社区工作者考试必背1000题题库【含答案】
- 开放系统10861《理工英语(4)》期末机考真题及答案(第109套)
- SYT 0452-2021 石油天然气金属管道焊接工艺评定-PDF解密
- 2024年江苏医药职业学院单招职业技能测试题库及答案解析
评论
0/150
提交评论