《C语言程序设计(第三版)》课件第11章 文件.ppt

上传人(卖家):momomo 文档编号:7375457 上传时间:2023-12-12 格式:PPT 页数:72 大小:776.50KB
下载 相关 举报
《C语言程序设计(第三版)》课件第11章 文件.ppt_第1页
第1页 / 共72页
《C语言程序设计(第三版)》课件第11章 文件.ppt_第2页
第2页 / 共72页
《C语言程序设计(第三版)》课件第11章 文件.ppt_第3页
第3页 / 共72页
《C语言程序设计(第三版)》课件第11章 文件.ppt_第4页
第4页 / 共72页
《C语言程序设计(第三版)》课件第11章 文件.ppt_第5页
第5页 / 共72页
点击查看更多>>
资源描述

1、l了解磁盘文件的概念和用途了解磁盘文件的概念和用途l掌握文件指针的概念和文件指针变量的定义方掌握文件指针的概念和文件指针变量的定义方法法l深刻理解文件的读、写、定位等基本操作的实深刻理解文件的读、写、定位等基本操作的实现现l熟悉文件的打开、关闭、读、写、定位等函数熟悉文件的打开、关闭、读、写、定位等函数的调用形式的调用形式l掌握文件操作在程序设计中的应用方法掌握文件操作在程序设计中的应用方法l掌握编译预处理的基本概念和使用形式掌握编译预处理的基本概念和使用形式 11.1 文件概述文件概述【问题问题】数据在计算机中如何被保存和阅读?数据在计算机中如何被保存和阅读?l11.1.1 文件的概念文件的

2、概念l所谓所谓“文件文件”是指一组相关数据的有序集合。是指一组相关数据的有序集合。这这个数据集有一个名称,叫做个数据集有一个名称,叫做文件名文件名。l例如例如:k:24000101program.c,其中其中k:24000101就就是路径,是路径,program.c是文件名。当需要使用文件的是文件名。当需要使用文件的时候,需要将文件调入内存中。时候,需要将文件调入内存中。11.1.2 文件的分类文件的分类 l从用户使用的角度看,文件可分为从用户使用的角度看,文件可分为普通文件普通文件和和设备文设备文件件l从文件编码和数据的组织方式来看,文件可分为从文件编码和数据的组织方式来看,文件可分为ASC

3、II码文件码文件和和二进制码文件二进制码文件。lASCII文件文件也称为也称为文本文件文本文件,文件在磁盘中存放时每个字符,文件在磁盘中存放时每个字符占一个字节,每个字节中存放相应字符的占一个字节,每个字节中存放相应字符的ASCII码。内存中码。内存中的数据存储时需要转换为的数据存储时需要转换为ASCII码。码。l二进制文件二进制文件则不同,内存中的数据存储的时候不需要进行数则不同,内存中的数据存储的时候不需要进行数据转换,存储介质上保存的数据采用与内存数据一致的表示据转换,存储介质上保存的数据采用与内存数据一致的表示形式存储。形式存储。11.1.2 文件的分类文件的分类l从从C语言对文件的处

4、理方法来看。旧的语言对文件的处理方法来看。旧的C版本(如版本(如Unix系统下使用的系统下使用的C)有两种对文件的处理方法:一)有两种对文件的处理方法:一种叫种叫“缓冲文件系统缓冲文件系统”,一种叫,一种叫“非缓冲文件系统非缓冲文件系统”。l缓冲文件系统缓冲文件系统:系统自动地在内存区为每一个正在使用的文:系统自动地在内存区为每一个正在使用的文件名开辟一个缓冲区。从内存向磁盘输出数据必须先送到内件名开辟一个缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。存中的缓冲区,装满缓冲区后才一起送到磁盘去。l非缓冲文件系统非缓冲文件系统:指系统不自动开辟确定大小的缓冲

5、区,而指系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。由程序为每个文件设定缓冲区。11.2 文件操作文件操作 11.2.1 FILE文件类型指针文件类型指针 typedef struct short level;/*缓冲区缓冲区“满满”或或“空空”的程度的程度*/unsigned flags;/*文件状态标志文件状态标志*/char fd;/*文件描述符文件描述符*/unsigned char hold;/*无缓冲区不读取字符无缓冲区不读取字符*/short bsize;/*缓冲区大小缓冲区大小*/unsigned char *buffer;/*数据缓冲区位置指针数据缓冲区位置

6、指针*/unsigned char *curp;/*当前指针指向当前指针指向*/unsigned istemp;/*临时文件指示器临时文件指示器*/short token;/*用于有效性检查用于有效性检查*/FILE;有了有了FILE类型以后可以定义文件类型指针变量。例如:类型以后可以定义文件类型指针变量。例如:FILE *fp;标准设备文件lC语言中的是由系统控制的,由系统自动打开语言中的是由系统控制的,由系统自动打开和关闭,其文件结构指针由系统命名,用户无和关闭,其文件结构指针由系统命名,用户无需说明即可直接使用,例如:需说明即可直接使用,例如:lstdin 标准输入文件(键盘)标准输入文

7、件(键盘)lstdout 标准输出文件(显示器)标准输出文件(显示器)lstderr 标准错误输出文件(显示器)标准错误输出文件(显示器)11.2.2 文件的打开操作文件的打开操作 lC语言用语言用fopen()函数来实现文件的打开。函数来实现文件的打开。fopen函数的调用方式一般为:函数的调用方式一般为:lFILE*fp;lfp=fopen(文件名,文件使用方式文件名,文件使用方式);l例如:例如:lfp=fopen(result.txt,r);11.2.2 文件的打开操作文件的打开操作l打开文件方式打开文件方式文件使用方式文件使用方式含含 义义r只读只读,文本文本以只读方式打开一个已有的

8、文本文件。以只读方式打开一个已有的文本文件。w只写只写,文本文本以只写方式建立一个新的文本文件。如果该文件以只写方式建立一个新的文本文件。如果该文件已存在则将它删去,然后重新建立一个新文件。已存在则将它删去,然后重新建立一个新文件。a追加追加,文本文本以添加方式打开一个文本文件,在文件末尾添加。以添加方式打开一个文本文件,在文件末尾添加。如果该文件不存在,则建立一个新文件后再添加。如果该文件不存在,则建立一个新文件后再添加。rb只读只读,二进制二进制以只读方式打开一个已有的二进制文件。以只读方式打开一个已有的二进制文件。wb只写只写,二进制二进制以只写方式打开一个二进制文件。以只写方式打开一个

9、二进制文件。ab追加追加,二进制二进制以添加方式打开一个二进制文件。以添加方式打开一个二进制文件。11.2.2 文件的打开操作文件的打开操作文件使用方式文件使用方式含含 义义r+读写读写,文本文本以读写方式打开一个已有的文本文件。以读写方式打开一个已有的文本文件。w+读写读写,文本文本以读写方式建立一个新的文本文件。以读写方式建立一个新的文本文件。a+读写读写,文本文本以读写方式打开一个文本文件,在文件末尾添加以读写方式打开一个文本文件,在文件末尾添加和修改,如果文件不存在,则建立一个新文件后和修改,如果文件不存在,则建立一个新文件后再添加和修改。再添加和修改。rb+读写读写,二进制二进制以读

10、写方式打开一个已有的二进制文件。以读写方式打开一个已有的二进制文件。wb+读写读写,二进制二进制以读写方式建立一个新的二进制文件。以读写方式建立一个新的二进制文件。ab+读写读写,二进制二进制以读写方式打开一个二进制文件。以读写方式打开一个二进制文件。l打开文件方式打开文件方式说 明l用以上方式可以打开文本文件或二进制文件,这用以上方式可以打开文本文件或二进制文件,这是是ANSI C的规定,即用同一种缓冲文件系统来处的规定,即用同一种缓冲文件系统来处理文本文件和二进制文件。但目前使用的有些理文本文件和二进制文件。但目前使用的有些C编译系统可能不完全提供所有这些功能(例如有编译系统可能不完全提供

11、所有这些功能(例如有的只能用的只能用“r”、“w”、“a”方式),有的方式),有的C版本版本不用不用“r+”、“w+”、“a+”而用而用“rw”、“wr”、“ar”等,请读者注意所用系统的规定。等,请读者注意所用系统的规定。说 明l如果不能实现如果不能实现“打开打开”的任务,的任务,fopen函数将会返函数将会返回一个出错信息。出错的原因可能是:用回一个出错信息。出错的原因可能是:用“r”方方式打开一个并不存在的文件;磁盘出故障;磁盘式打开一个并不存在的文件;磁盘出故障;磁盘已满无法建立新文件等。此时已满无法建立新文件等。此时fopen函数将带回一函数将带回一个空指针值个空指针值NULL(NU

12、LL在在stdio.h文件中已被定文件中已被定义为义为0)。常用下面的方法打开一个文件:。常用下面的方法打开一个文件:lif(fp=fopen(filename,r“)=NULL)printf(cannot open this file.n“);exit(0);说 明l用用“w”方式打开文件时,只能从内存向该文方式打开文件时,只能从内存向该文件输出(写)数据,件输出(写)数据,而不能从文件向内存输而不能从文件向内存输入数据。如果该文件原来不存在,则打开时按入数据。如果该文件原来不存在,则打开时按指定文件名建立一个新文件。如果原来的文件指定文件名建立一个新文件。如果原来的文件已经存在,则打开时将

13、文件删空,然后重新建已经存在,则打开时将文件删空,然后重新建立一个新文件,所以务必小心。立一个新文件,所以务必小心。说 明l用用“a”方式打开文件时,向文件的尾部添加新方式打开文件时,向文件的尾部添加新数据,文件中原来的数据保留,但要求文件必数据,文件中原来的数据保留,但要求文件必须存在,否则会返回出错信息。打开文件时,须存在,否则会返回出错信息。打开文件时,文件的位置指针在文件末尾。文件的位置指针在文件末尾。l 用用“r+”、“w+”、“a+”方式打开文件时方式打开文件时,既既可以输入也可以输出,不过三种方式是有区别可以输入也可以输出,不过三种方式是有区别的:的:“r+”方式要求必须文件存在

14、;方式要求必须文件存在;“w+”方方式则建立新文件后进行读写;式则建立新文件后进行读写;“a+”方式则保方式则保留文件原有的数据,进行追加或读的操作。留文件原有的数据,进行追加或读的操作。说 明l在用文本文件向计算机输入时,应将回车和换在用文本文件向计算机输入时,应将回车和换行两个字符转换为一个换行符;在输出时,应行两个字符转换为一个换行符;在输出时,应将换行符转换为回车和换行两个字符。在用二将换行符转换为回车和换行两个字符。在用二进制文件时,不需进行这种转换,因为在内存进制文件时,不需进行这种转换,因为在内存中的数据形式与输出到外部文件中的数据形式中的数据形式与输出到外部文件中的数据形式完全

15、一致,一一对应。完全一致,一一对应。说 明l在程序开始运行时,系统自动打开三个标准文在程序开始运行时,系统自动打开三个标准文件:标准输入、标准输出、标准出错输出。通件:标准输入、标准输出、标准出错输出。通常这三个文件都与终端相联系。因此以前我们常这三个文件都与终端相联系。因此以前我们所用到的从终端输入或输出,都不需要打开终所用到的从终端输入或输出,都不需要打开终端文件。系统自动定义了三个文件指针端文件。系统自动定义了三个文件指针stdin、stdout和和stderr,分别指向终端输入、终端输,分别指向终端输入、终端输出和标准出错输出(也从终端输出)。如果程出和标准出错输出(也从终端输出)。如

16、果程序中指定要从序中指定要从stdin所指的文件输入数据,就所指的文件输入数据,就是指从终端键盘输入数据。是指从终端键盘输入数据。11.2.3 文件的关闭操作文件的关闭操作 l文件在使用完后应该及时关闭它,以防止它再被误用。文件在使用完后应该及时关闭它,以防止它再被误用。“关闭关闭”就是释放文件指针。释放后的文件指针变量不就是释放文件指针。释放后的文件指针变量不再指向该文件,为自由的文件指针。这种方式可以避免再指向该文件,为自由的文件指针。这种方式可以避免文件中的数据丢失。释放指针后不能再通过该指针对原文件中的数据丢失。释放指针后不能再通过该指针对原对应的文件进行读写操作,除非再次用该指针变量

17、打开对应的文件进行读写操作,除非再次用该指针变量打开该文件。该文件。l用用fclose函数关闭文件。函数关闭文件。fclose函数调用的一般形式为:函数调用的一般形式为:lfclose(文件指针);(文件指针);l例如:例如:lfclose(fp););l如果文件关闭成功,如果文件关闭成功,fclose函数返回值为函数返回值为0;如果关闭;如果关闭出错,则返回值为出错,则返回值为EOF(-1)。这可以用)。这可以用ferror函数来函数来测试。测试。11.2.4 文件的读写操作文件的读写操作 l字符读写函数字符读写函数l字符输入函数字符输入函数fgetcl从指定文件读入一个字符,该文件必须是以

18、读或读从指定文件读入一个字符,该文件必须是以读或读写方式打开的。写方式打开的。lfgetc函数的调用形式为:函数的调用形式为:lch=fgetc(fp);【例例11-1】显示文本文件显示文本文件readme.txt的内容。的内容。#include void main()FILE*fp;char ch;if(fp=fopen(readme.txt,r)=NULL)printf(file open error.n);exit(0);while(ch=fgetc(fp)!=EOF)putchar(ch);fclose(fp);l该程序完成:从一文件名为该程序完成:从一文件名为“readme.txt”

19、的磁盘文的磁盘文件中顺序读取字符,并在标准输出设备显示器上输出。件中顺序读取字符,并在标准输出设备显示器上输出。注意注意 lEOF为文本文件的结束标志。二进制文件中的为文本文件的结束标志。二进制文件中的数据,某一个字节的值可能是数据,某一个字节的值可能是-1,而这又恰好,而这又恰好是是EOF的值。所以,上述程序只适合处理文本的值。所以,上述程序只适合处理文本文件。文件。ANSI C已允许用缓冲区文件系统处理二已允许用缓冲区文件系统处理二进制文件进制文件.l为了解决上述问题,为了解决上述问题,ANSI C提供了一个提供了一个feof函函数来判断文件是否真的结束。数来判断文件是否真的结束。lfeo

20、f(fp)用来测试用来测试fp所指向的文件当前状态是所指向的文件当前状态是否为否为“文件结束文件结束”。l如果是文件结束,函数如果是文件结束,函数feof(fp)的值为的值为1(真),否则为(真),否则为0(假)。(假)。注意注意l如果想顺序读取一个二进制文件的数据,上面如果想顺序读取一个二进制文件的数据,上面的程序修改为:的程序修改为:ch=fgetc(fp);while(!feof(fp)/*相当于相当于while(feof(fp)=0)*/putchar(ch);ch=fgetc(fp);字符输出函数字符输出函数fputc lfputc函数把一个字符输出到磁盘文件上。其函数把一个字符输出

21、到磁盘文件上。其一般形式为:一般形式为:lfputc(ch,fp););l【说明说明】ch是要输出的字符,它可以是一个字符是要输出的字符,它可以是一个字符常量,也可以是一个字符变量。常量,也可以是一个字符变量。【例例11-2】从键盘上输入的字符代码顺序存入名为从键盘上输入的字符代码顺序存入名为“result.txt”的磁盘文件中,当键盘输入的磁盘文件中,当键盘输入Ctrl+Z时关闭时关闭文件,输入结束。文件,输入结束。#include stdio.hvoid main()FILE*fp;int ch;if(fp=fopen(result.txt,w)=NULL)printf(file crea

22、ted error.n);exit(0);do ch=getchar();/*注意次序,先输入字符再写到文件中注意次序,先输入字符再写到文件中*/fputc(ch,fp);while(ch!=EOF);fclose(fp);【例例11-3】编程完成将文本文件编程完成将文本文件readme.txt 复制到复制到result.txt中。中。while(ch=fgetc(fp1)!=EOF)fputc(ch,fp2);fclose(fp1);fclose(fp2);#include main()FILE*fp1,*fp2;char ch;if(fp1=fopen(readme.txt,r)=NULL

23、)printf(file1 openned error.n);exit(0);if(fp2=fopen(result.txt,w)=NULL)printf(file2 created error.n);exit(0);字符串读写函数字符串读写函数 l读文件字符串函数读文件字符串函数fgetsl从指定文件读入一个字符串,该文件必须是从指定文件读入一个字符串,该文件必须是以读或读写方式打开的。以读或读写方式打开的。fgets函数的调用函数的调用形式为形式为:lfgets(str,n,fp);l【说明说明】参数参数str可以是一个字符型数组名或指向可以是一个字符型数组名或指向字符串的指针;参数字符串

24、的指针;参数n为读取的最多的字符个数;为读取的最多的字符个数;参数参数fp为要读取文件的指针。为要读取文件的指针。字符串读写函数字符串读写函数-fgetsl【功能功能】从从fp指定的文件中读取长度不超过指定的文件中读取长度不超过n-1个字符的字符串,并将该字符串放到字符数个字符的字符串,并将该字符串放到字符数组组str中。读取成功,函数返回字符数组中。读取成功,函数返回字符数组str的的首地址;如果文件结束或出错,则返回首地址;如果文件结束或出错,则返回NULL。读取操作遇到以下情况结束:读取操作遇到以下情况结束:已经读取了已经读取了n-1个字符;个字符;当前读取到的字符为回车符;当前读取到的

25、字符为回车符;已读取到文件末尾。已读取到文件末尾。注意注意 l使用该函数时,从文件读取的字符个数不会超过使用该函数时,从文件读取的字符个数不会超过n-1个,这是由于在字符串尾部还需自动追加一个个,这是由于在字符串尾部还需自动追加一个“0”字符,这样读取到的字符串在内存缓冲区正好占有字符,这样读取到的字符串在内存缓冲区正好占有n个字节。个字节。l如果从文件中读取到回车符时,也作为一个字符送入如果从文件中读取到回车符时,也作为一个字符送入由由str所指的内存缓冲区,然后再向缓冲区送入一个所指的内存缓冲区,然后再向缓冲区送入一个“0”字符。字符。l应注意,应注意,fgets()函数在使用函数在使用s

26、tdin作为作为fp参数时与参数时与gets()函数功能有所不同:函数功能有所不同:gets()把读取到的回车符把读取到的回车符转换成转换成“0”字符,而字符,而fgets()把读取到的回车符作为把读取到的回车符作为字符存储,然后再在末尾追加字符存储,然后再在末尾追加“0”字符。字符。注意注意l假设文件假设文件readme.txt的内容如下:的内容如下:l有数组有数组char str8;,文件指针,文件指针fp指向指向readme.txt,读写,读写位置指向字符位置指向字符c。运行语句。运行语句fgets(str,8,fp);后后str的内容的内容为:为:l再次运行再次运行fgets(str,

27、8,fp);后后str的内容为:的内容为:l第第3次运行次运行fgets(str,8,fp);后后str的内容为:的内容为:字符串输出函数字符串输出函数fputslfputs函数把一个字符串输出到磁盘文件上。函数把一个字符串输出到磁盘文件上。其一般形式为:其一般形式为:l fputs(str,fp);l【说明说明】str可以是指向字符串的指针或字符数组可以是指向字符串的指针或字符数组名,也可以是字符串常量;名,也可以是字符串常量;fp为指向写入文件的指为指向写入文件的指针。针。l【功能功能】将由将由str指定的字符串写入指定的字符串写入fp所指向的文所指向的文件中。件中。注意注意 l与与fge

28、ts()函数在输入字符串时末尾自动追加函数在输入字符串时末尾自动追加“0”字符的特性相对应,字符的特性相对应,fputs()函数在将字函数在将字符串写入文件时,其末尾的符串写入文件时,其末尾的“0”字符自动舍字符自动舍去。去。l当当fputs()函数使用函数使用stdout作为作为fp参数时,即参数时,即fputs(str,stdout)与与puts(str)在功能上有所不在功能上有所不同:同:fputs()舍弃输出字符串末尾加入的舍弃输出字符串末尾加入的“0”字符,而字符,而puts()把它转换成回车符输出。把它转换成回车符输出。l正常操作时,返回值为写入的字符个数;出错正常操作时,返回值为

29、写入的字符个数;出错时,返回值为时,返回值为EOF(-1)。)。【例例11-4】将键盘输入的若干行字符将键盘输入的若干行字符存入到磁盘文件存入到磁盘文件result.txt中中#include void main()FILE*fp;char str101;if(fp=fopen(result.txt,w)=NULL)printf(file created error.n);exit(0);while(strlen(gets(str)0)/*读取字符串,输入空串时结束读取字符串,输入空串时结束*/fputs(str,fp);/*写到文件写到文件fp中中 */fputs(n,fp);fclose(

30、fp);【例例11-5】编程完成将文本文件编程完成将文本文件readme.txt 复制到复制到result.txt中。中。#include void main()FILE*fp1,*fp2;char str20;if(fp1=fopen(readme.txt,r)=NULL)printf(file1 openned error.n);exit(0);if(fp2=fopen(result.txt,w)=NULL)printf(file2 created error.n);exit(0);while(fgets(str,20,fp1)!=NULL)fputs(str,fp2);fclose(fp

31、1);fclose(fp2);数据块读写函数数据块读写函数 l文件数据块读函数文件数据块读函数freadlfread函数用来从指定文件中读取一个指定字节的函数用来从指定文件中读取一个指定字节的数据块。它的一般调用形式为数据块。它的一般调用形式为lfread(buffer,size,count,fp);l【说明说明】buffer为读入数据在内存中存放的起始地址;为读入数据在内存中存放的起始地址;size为每次要读取的字符数;为每次要读取的字符数;count为要读取的次数;为要读取的次数;fp为文件类型指针。为文件类型指针。l【功能功能】在在fp指定的文件中读取指定的文件中读取count次数据项(

32、每次数据项(每次次size个字节)存放到以个字节)存放到以buffer所指的内存单元地址所指的内存单元地址中。中。数据块读写函数数据块读写函数l文件数据块写函数文件数据块写函数fwritelfwrite函数用来将数据输出到磁盘文件上。它的一般调函数用来将数据输出到磁盘文件上。它的一般调用形式为用形式为lfwrite(buffer,size,count,fp);l【说明说明】buffer为输出数据在内存中存放的首地址;为输出数据在内存中存放的首地址;size为每次要输出到文件中的字节数;为每次要输出到文件中的字节数;count为要输为要输出的次数;出的次数;fp为文件类型指针。为文件类型指针。l

33、【功能功能】将从将从buffer为首地址的内存中取出为首地址的内存中取出count次次数据项(每次数据项(每次size个字节)写入个字节)写入fp所指的磁盘文件中所指的磁盘文件中注意注意 l当文件以二进制形式打开时,当文件以二进制形式打开时,fread函数就可函数就可以读取任何类型的信息。例如:以读取任何类型的信息。例如:lfread(array,4,5,fp);l其中,其中,array为一个实型数组名,一个实型量占为一个实型数组名,一个实型量占4个个字节。该函数从字节。该函数从fp所指的数据文件中读取所指的数据文件中读取5次次4字节字节的实型数据,存储到数组的实型数据,存储到数组array中

34、。中。lfread()函数读取的数据块的总字节数应该是函数读取的数据块的总字节数应该是size*count个字节。正常操作时函数的返回值个字节。正常操作时函数的返回值为读取的项数,出错时为为读取的项数,出错时为-1。注意注意l当文件以二进制形式打开时,当文件以二进制形式打开时,fwrite函数就可函数就可以写入任何类型的信息。例如:以写入任何类型的信息。例如:lfwrite(array,2,10,fp);l其中,其中,array为一个整型数组名,一个整型量占两为一个整型数组名,一个整型量占两个字节。该函数将整型数组中个字节。该函数将整型数组中10个两字节的整型数个两字节的整型数据写入由据写入由

35、fp所指的磁盘文件中。所指的磁盘文件中。l与与fread()函数一样写入的数据块的总字节是函数一样写入的数据块的总字节是size*count个字节。正常操作时返回值为写入个字节。正常操作时返回值为写入的项数,出错时返回值为的项数,出错时返回值为-1。【例例11-6】编程从键盘输入编程从键盘输入3个学生的数据,将个学生的数据,将它们存入到文件它们存入到文件result.dat中,然后再读出显示中,然后再读出显示在屏幕上。在屏幕上。#include#dedefine SIZE 3struct student int no;char name10;int age;char address20;stu

36、dSIZE,fout;void student_save()int i;FILE*fp;if(fp=fopen(result.dat,wb)=NULL)printf(file created error.n);return;for(i=0;iSIZE;i+)/*写学生的信息写学生的信息*/if(fwrite(&studi,sizeof(struct student),1,fp)!=1)printf(file write error.n);fclose(fp);【例例11-6】编程从键盘输入编程从键盘输入3个学生的数据,将个学生的数据,将它们存入到文件它们存入到文件result.dat中,然后再

37、读出显示中,然后再读出显示在屏幕上。在屏幕上。void student_display()FILE*fp;int i;if(fout=fopen(result.dat,rb)=NULL printf(file openned error.n);return;printf(No.Name Age Addressn);while(fread(&fout,sizeof(fout),1,fp)printf(%4d%-10s%4d%-20s,fout.no,fout.name,fout.age,fout.address);fclose(fp);【例例11-6】编程从键盘输入编程从键盘输入3个学生的数据,

38、将个学生的数据,将它们存入到文件它们存入到文件result.dat中,然后再读出显示中,然后再读出显示在屏幕上。在屏幕上。void main()int i;for(i=0;iSIZE;i+)/*从键盘读入学生的信息(结构)从键盘读入学生的信息(结构)*/printf(Please input student%d:,i+1);scanf(%d%s%d%s,&studi.no,studi.name,&studi.age,studi.address);student_save();student_display();格式化输入输出函数格式化输入输出函数fprintf函数函数和和fscanf函数函数

39、l格式化输入函数格式化输入函数fscanfl函数调用的格式为函数调用的格式为lfscanf(fp,格式控制串,输入列表),格式控制串,输入列表);l【说明说明】fp是指向要读取文件的文件型指针,是指向要读取文件的文件型指针,格式控制串,输出列表同格式控制串,输出列表同scanf函数。函数。l【功能功能】从从fp指向的文件中,按格式控制串中指向的文件中,按格式控制串中的控制符读取相应数据赋给输入列表中对应的的控制符读取相应数据赋给输入列表中对应的变量地址中变量地址中。格式化输入输出函数格式化输入输出函数fprintf函数函数和和fscanf函数函数l格式化输出函数格式化输出函数fprintfl函

40、数调用的格式为函数调用的格式为l fprintf(fp,格式控制串,输出列表),格式控制串,输出列表);l【说明说明】fp是指向要写入文件的文件型指针,是指向要写入文件的文件型指针,格式控制串,输出列表同格式控制串,输出列表同printf函数。函数。l【功能功能】将输出列表中的各个变量或常量,依将输出列表中的各个变量或常量,依次按格式控制串中的控制符说明的格式写入次按格式控制串中的控制符说明的格式写入fp指向的文件中。指向的文件中。说 明l用用fprintf和和fscanf函数对磁盘文件读写,使用函数对磁盘文件读写,使用方便,容易理解,但由于在输入输出时要进行方便,容易理解,但由于在输入输出时

41、要进行ASCII码和二进制的转换,时间开销大,因此,码和二进制的转换,时间开销大,因此,在内存与磁盘频繁交换数据的情况下,最好不在内存与磁盘频繁交换数据的情况下,最好不用用fprintf和和fscanf函数,而用函数,而用fread和和fwrite函函数。数。其他读写函数其他读写函数 l(字字)整数输入输出函数整数输入输出函数getw和和putwlputw和和getw用来对磁盘文件读写一个字(整数)。用来对磁盘文件读写一个字(整数)。l例如:例如:lputw(100,fp);l它的作用是将整数它的作用是将整数100输出到输出到fp所指的文件,而所指的文件,而li=getw(fp);l作用是从磁

42、盘文件中读一个整数到内存,赋给整型变作用是从磁盘文件中读一个整数到内存,赋给整型变量量i。l 读写其他类型数据读写其他类型数据 l对于系统没有提供函数的和不能方便完成的读写操作,对于系统没有提供函数的和不能方便完成的读写操作,用户可以自定义读写函数,这样的函数具有很好的针对用户可以自定义读写函数,这样的函数具有很好的针对性。性。11.3 文件的定位文件的定位 l11.3.1 置文件位置指针于文件开头位置的函数置文件位置指针于文件开头位置的函数 rewind()lrewind()函数的一般调用形式为:函数的一般调用形式为:lrewind(fp);l【说明说明】fp是指向由是指向由fopen函数打

43、开的文件指函数打开的文件指针针l【功能功能】使位置指针重新返回文件的开头,此使位置指针重新返回文件的开头,此函数没有返回值函数没有返回值。【例例11-7】有一磁盘文件有一磁盘文件readme.txt,首先将,首先将其内容显示在屏幕上,然后把它复制到另一文其内容显示在屏幕上,然后把它复制到另一文件件result.txt上。上。#include stdio.hvoid main()FILE*fp1,*fp2;if(fp1=fopen(readme.txt,r)=NULL)printf(file openned error.n);exit(0);if(fp2=fopen(result.txt,w)=

44、NULL)printf(file created error.n);exit(0);while(!feof(fp1)putchar(fgetc(fp1);rewind(fp1);/*重置文件位置指针至文件头重置文件位置指针至文件头*/while(!feof(fp1)fputc(fgetc(fp1),fp2);fclose(fp1);fclose(fp2);11.3.2 改变文件位置指针位置的改变文件位置指针位置的函数函数fseek lfseek 函数的调用形式为:函数的调用形式为:lfseek(fp,offset,whence);l【说明说明】fp为指向当前文件的指针;为指向当前文件的指针;o

45、ffset为文件为文件位置指针的位移量,指以起始位置为基准值向前移位置指针的位移量,指以起始位置为基准值向前移动的字节数,要求动的字节数,要求offset为为long型数据;型数据;whence为起始位置,用整型常量表示,为起始位置,用整型常量表示,ANSI C规定它必规定它必须是须是0、1或或2之一值,它们表示三个符号常数,在之一值,它们表示三个符号常数,在stdio.h中定义如下:中定义如下:名字名字值值起始位置起始位置SEEK_SET0文件开头文件开头SEEK_CUR1文件当前位置文件当前位置SEEK_END2文件末尾文件末尾11.3.2 改变文件位置指针位置的改变文件位置指针位置的函数

46、函数fseekl【功能功能】将文件位置指针移到由起始位置(将文件位置指针移到由起始位置(whence)开)开始、位移量为始、位移量为offset的字节处。如果函数读写指针移动失的字节处。如果函数读写指针移动失败,返回值为败,返回值为-1。lfseek函数一般用于二进制文件,因为文本文件要发生字函数一般用于二进制文件,因为文本文件要发生字符转换,计算位置时往往会发生混乱。符转换,计算位置时往往会发生混乱。l下面是下面是fseek函数调用的几个例子:函数调用的几个例子:lfseek(fp,100L,0);/*将位置指针移到离文件头将位置指针移到离文件头100个字节处个字节处*/lfseek(fp,

47、50L,1);/*将位置指针移到离当前位置将位置指针移到离当前位置50个字节处个字节处*/lfseek(fp,-20L,2);/*将位置指针从文件末尾处向后退将位置指针从文件末尾处向后退20个字节个字节*/l注意偏移量为长整型,如注意偏移量为长整型,如100L。l利用利用fseek函数就可以实现随机读写。函数就可以实现随机读写。11.3.3 取得文件当前位置的函数取得文件当前位置的函数ftell lftell函数的作用是得到流式文件中的当前位置,函数的作用是得到流式文件中的当前位置,用相对于文件开头的位移量来表示。由于文件用相对于文件开头的位移量来表示。由于文件中的位置指针经常移动,人们往往不

48、容易辨清中的位置指针经常移动,人们往往不容易辨清其当前位置。用其当前位置。用ftell函数可以得到当前位置。函数可以得到当前位置。如果如果ftell函数返回值为函数返回值为-1L,则表示出错。例,则表示出错。例如:如:lif(ftell(fp)=-1L)lprintf(errorn);11.3.4 文件的错误检测文件的错误检测 l文件读写错误检测函数文件读写错误检测函数l在调用各种输入输出函数(如在调用各种输入输出函数(如fputc、fgetc、fread、fwrite等)时,如果出现错误,则除了函数返回值有所反映外,还等)时,如果出现错误,则除了函数返回值有所反映外,还可以用可以用ferro

49、r函数检查,它的一般调用形式为:函数检查,它的一般调用形式为:lferror(fp);l如果如果ferror返回值为返回值为0(假),则表示未出错。如果返回一个(假),则表示未出错。如果返回一个非非0值,则表示出错。应该注意,对同一个文件,每一次调值,则表示出错。应该注意,对同一个文件,每一次调用输入输出函数,均产生一个新的用输入输出函数,均产生一个新的ferror函数值,因此,应函数值,因此,应当在调用一个输入输出函数后立即检查当在调用一个输入输出函数后立即检查ferror函数的值,否函数的值,否则信息会丢失。则信息会丢失。l在执行在执行fopen函数时,函数时,ferror函数的初始值自动

50、置为函数的初始值自动置为0。11.3.4 文件的错误检测文件的错误检测l清除文件错误标志函数清除文件错误标志函数lclearerr函数的作用是使文件错误标志和文件结束函数的作用是使文件错误标志和文件结束标志置为标志置为0。假设在调用一个输入输出函数时出现。假设在调用一个输入输出函数时出现错误,错误,ferror函数值为一个非函数值为一个非0值。在调用值。在调用clearerr(fp)后,)后,ferror(fp)的值变成)的值变成0。l只要出现错误标志,就一直保留,直到对同一文件只要出现错误标志,就一直保留,直到对同一文件调用调用clearerr函数或函数或rewind函数,或任何其他一个函数

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

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《C语言程序设计(第三版)》课件第11章 文件.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|