第10章-文件.ppt

上传人:豆**** 文档编号:56521425 上传时间:2022-11-02 格式:PPT 页数:22 大小:452.50KB
返回 下载 相关 举报
第10章-文件.ppt_第1页
第1页 / 共22页
第10章-文件.ppt_第2页
第2页 / 共22页
点击查看更多>>
资源描述

《第10章-文件.ppt》由会员分享,可在线阅读,更多相关《第10章-文件.ppt(22页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第第1010章章-文件文件高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础第十章第十章文件高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础导言q程序需要处理大量的数据,前面示例程序中的所需数据大都是通过终端输入设备临时输入,结果则是通过终端输出设备显示,程序运行结束后所有数据也随之消失。如果用户要使用相同的数据再次执行程序,就必须重新输入一遍。q例如,程序要对一组姓名、地址以及电话号码进行处理,完成一定的统计工作。如果,每次程序执行时都必须重新输入一遍姓名、地址以及电话号码,那这个程序就不会有人愿意使用了。解决方法是将这些数据存储到一个即使关掉计算机数据也不

2、会消失的存储设备中,如通过文件存储到硬盘上,每次程序运行时直接从存储设备上读取相关内容即可。同时,程序运行所需数据都存储在主内存中也是不现实的,很多应用程序所需的数据量都远大于主内存所能提供的存储空间,常常需要具备处理外部设备(外存,磁盘)所存储的数据的能力。3高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础文件概述 q文件是程序设计中的一个重要概念,一般指存储在外部介质上数据的集合。文件是普通用户在计算机中进行数据存储的常用对象,也是操作系统对数据进行管理的基本单位。当需要使用外存储器上的数据时,需要首先知道存储该数据的文件,并通过文件名找到指定文件,然后再从该文件中读取数

3、据。要向外存储器上存储数据则需要先建立一个文件,才能向文件中写入数据。q为了简化用户对输入输出设备的操作,使用用户不必去具体处理各种输入输出设备之间的差异,操作系统把各种设备都统一作为文件来处理。从操作系统角度看,每一个与计算机相连的输入输出设备都被看作是一个文件。例如键盘是输入文件,显示器和打印机是输出文件,对它们的操作都是通过相应的“文件名”进行。程序设计过程中,经常需要访问文件,以读取保存在文件中的数据或者将程序数据保存到指定文件中。4高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础流和文件指针 q计算机中每种输入输出设备都具有不同的使用方法和通信协议,操作系统负责管理

4、这些不同设备的通信细节,并对外提供更为简单和统一的I/O接口函数。实际编程时,C语言又进一步对此I/O接口进行抽象,引入流(stream)的概念。输入输出操作是数据传送的过程,数据如流水一样从一端流到另一端,因此常将输入输出形象地称为流。流表示了信息从“源”到“目的”端的流动。如果程序中需要使用文件作为数据输入的来源,即从文件中读取数据,需要创建与该文件关联的输入流;反之,如果需要将程序产生的数据输出到文件时,需要创建与该文件关联的输出流。这种创建流的操作被形象的称为打开文件,文件打开后就可以进行读写等操作了。图10-1是对程序使用外存中文件的形象描述:q流是程序与文件间的信息通道,当一个文件

5、不再被使用时,程序可以撤销相关的输入输出流,称为关闭文件。打开和关闭都是文件处理的基本操作。标准库中提供了一套流的操作函数,包括流的创建(打开文件)、流的撤销(关闭文件)、流的读写操作(通过流对文件进行读和写)等。执 行 中 的程序流流文件文件5高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础流和文件指针q流通过一种特殊的数据结构实现,标准库为此定义了FILE结构类型,这种类型的变量用于保存与流有关的所有信息,定义如下:q打开文件的操作会返回一个FILE类型的指针(称为文件指针),代表所创建的流,可以通过对流的操作完成对相应文件的操作,这些操作都通过文件指针进行。人们常把文件

6、指针作为流的同义词。q每个C程序启动时都会自动创建三个标准流(建立三个文件指针):标准输入流(指针名为stdin)、标准输出流(stdout)和标准错误流(stderr)。stdin通常直接与操作系统的标准输入连接;stdout与操作系统的标准输出连接;stderr通常直接连接显示器,用于显示错误信息。程序执行时可直接使用这三个文件指针,进行对标准设备的输入输出操作。默认情况下,标准输入输出库中的printf函数向stdout进行写操作,scanf函数从stdin读取数据。6高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础文件中的位置 q通过文件指针操作文件时,需要注意理解文

7、件的位置。文件位置通常定义为从文件头到当前位置有多少个字节数。当前位置就是发生文件操作(读写文件)的地方。当需要从文件指定位置进行读写时,需要先将文件指针移动到目标位置,然后才能进行相关操作。q新的当前位置通常使用距离文件开头的偏移量(相距的字节数)来表示,或者在某些情况下,指定为从当前位置算起的正或负偏移量,正负偏移量分别代表了不同的移动方向。正的偏移量通常指从文件指针的当前位置向文件尾方向移动,负偏移量通常指从当前位置向文件头方向移动,偏移量的绝对值代表了移动的距离。字节0字节1字节2字节3 字节n-1 字节n文件头当前位置=文件头+4文件尾当前-27高职学院高职学院 计算机教研室计算机教

8、研室程序设计基础程序设计基础文件的分类 qC语言中根据文件数据的组织形式(数据在磁盘上的存储形式)可以将文件细分为文本文件(或称ASCII文件)和二进制文件。q对于文本文件,存储的数据均被看作是普通字符,采用其对应的ASCII码形式进行存储,保存在内存中的所有数据在存入文件的时候都要先转换为等价的字符形式,每个字符占用1个字节。文本文件在多数操作系统下可以直接阅读。二进制文件与文本文件不同,其将内存中的数据存入文件的时候不需要进行数据转换,磁盘文件上保存的数据格式与内存中的数据存储格式一致。二进制文件通常无法直接通过文本编辑器阅读。q例如,整型常量1048576(220)采用ASCII形式保存

9、在文本文件中要占用7个字节(共有7个字符),若按二进制形式保存在二进制文件中则占用4个字节。示意图见教材q为了方便处理上述两种类型的文件,C语言将流相应划分为文本(text)流和二进制(binary)流。文本流是指在流中流动的数据是以字符形式出现,二进制流是指在流中流动的数据是以二进制数表示。文本流适合一般的输入和输出,操作过程中需要进行二进制形式和字符形式的转换。二进制流用于把数据按内存里的形式直接存入文件,数据写入和读回格式相同,无需格式转换,主要用于程序内部数据的保存和重新装入。由于二进制流操作中不做数据形式转换,在保存和装入大批数据时有速度优势,但这种保存方式不适合人的阅读。8高职学院

10、高职学院 计算机教研室计算机教研室程序设计基础程序设计基础文件访问 q磁盘上的每个文件都有一个名称,当程序中需要访问一个文件时,需要首先依据文件名创建用于关联程序和物理文件的文件指针,然后借助文件指针完成相关读写操作,并在使用结束后撤销文件指针。文件指针可以在不同时刻关联到不同的文件上,如果要处理多个文件,但一次只处理一个,一个文件指针就够用了。使用过程中还可以对已有的文件进行重命名和删除操作。qC语言使用标准库函数fopen()实现打开文件的操作,它返回关联特定外部文件的文件指针,程序中使用一个FILE类型的指针变量保存该文件指针,就可以在程序里通过该指针进行文件操作了。fopen的原型是:

11、FILE*fopen(const char*file_name,const char*mode);q上表给出的多是对文本文件的操作模式,要以二进制方式打开就在相应的模式字符串中增加字符b。如“rb”、“wb+”、“a+b”分别表示以二进制只读、二进制写更新、二进制添加并可读方式打开文件。9高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础打开文件q程序中可以通过如下语句以可写模式打开文本文件myfile.txt:FILE*fp;fp=fopen(“myfile.txt”,“w”);q打开当前目录下的文件myfile.txt,将物理文件关联到文件指针变量fp上。如果myfile.

12、txt不存在,该语句就会创建它。打开时也可指定一个包含完整路径和文件名的字符串,如果在该路径下没有找到文件,就在该位置上创建文件。如果fopen函数调用失败,就返回NULL。q在常见的文件打开操作语句如下:if(fp=fopen(myfile.txt,r)=NULL)printf(Cannot open file.n);/如果文件出错显示提示信息 exit(0);/调用exit函数终止程序运行q系统对同时打开的文件数量是有限制的,一次能够同时打开的文件数由中定义的常量FOPEN_MAX确定,其指定了一次可以打开的最大流数。程序设计时如果在文件使用结束后忘记关闭文件,可能会造成流的丢失和资源浪费

13、,甚至造成后续的文件打开失败。10高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础关闭文件 q在执行完文件的操作后,需要告诉操作系统释放文件指针,撤销对应的流,这被称为关闭文件。虽然程序在结束前会自动关闭所有的打开文件,但文件打开过多会导致系统运行缓慢,浪费系统中的流资源,需要通过显式的关闭操作来提高系统整体的执行效率。qC语言用fclose()函数关闭文件,该函数将文件指针作为参数,返回int类型的值。如果成功关闭文件,返回0,否则返回EOF。EOF是一个特殊的符号常量,在中定义,通常值为-1,作为文件结束标志,表示不能再从流中获得数据了。qfclose函数的原型和调用形式

14、如下:int fclose(FILE*stream);/fclose函数的原型声明fclose(fp);/关闭上节中打开的文件 11高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础文件重命名 q在许多情况下都需要对文件进行重命名。例如,当我们更新文件的内容时,系统会先创建一个新的临时文件作为原始文件的副本,更新操作在临时文件上进行,更新成功后删除原始文件,再将此临时文件的名称更改成被删除的文件名。q文件重命名操作非常简单,可使用rename()函数实现,其原型如下:int rename(const char*old_name,const char*new_name);q如果文

15、件名更改成功,就返回整数0,否则返回非零值。调用rename()函数时,文件必须处于关闭状态,否则操作会失败。使用示例如下:if(rename(“C:tempmyfile.txt”,“C:tempmyfile_copy.txt”)printf(“Failed to rename file!n”);elseprintf(“File rename successfully!n”);q这个例子会将C盘temp目录下的名为myfile.txt的文件改名为myfile_copy.txt,并根据改名操作的结果显示相应提示信息。如果文件路径有错或者文件不存在,重命名操作会失败。12高职学院高职学院 计算机教

16、研室计算机教研室程序设计基础程序设计基础删除文件 q文件的删除操作也很常用,程序中可能会需要临时建立文件以保存运行的中间结果数据,当该数据不再需要时对应的文件也需要删除。删除文件可以使用remove()函数实现。其用法如下:remove(myfile.txt);q这行这条语句会从当前目录中删除myfile.txt文件。在调用remove()函数删除文件时,文件同样必须处于关闭状态,否则会出错。13高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础文件读写 q读取和写入是文件的常用操作,文件的读写方式可细分为顺序读写和随机读写。顺序读写是指按照文件中数据存储的先后顺序,从头到尾顺

17、序进行读写。随机读写则是指可以根据需要随机读取文件中指定位置的数据。对于标准设备文件,其打开和关闭操作由系统自动完成,只能顺序读取和写入。对于用户创建的一般文件,访问文件时需要在程序中显式的完成文件的打开和关闭操作,可以对文件进行顺序读写,也可进行随机读写。随机读写时通常要求文件中的每条记录具有固定的长度,以便于直接访问指定记录信息。q在C程序中使用文件,通常需要完成以下工作:1.声明一个FILE*类型的指针变量。2.调用fopen函数将此变量与要操作的实际文件相关联,执行打开文件操作,并指明该文件是用于输入还是输出。3.根据需要,调用标准库中提供的适当的函数完成必要的I/O操作。对于输入文件

18、(r模式)来说,这些函数将从文件中将数据读入至程序中进行处理;对于输出文件(w和a模式)来说,函数将程序中的数据写入到文件中去。4.调用fclose函数结束文件操作,断开文件指针与实际文件间的联系,关闭文件。14高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础通过文件读写单个字符 q文本文件处理的最简单的方法是逐个字符地遍历文件,从文件中读取单个字符的函数fgetc和向文件写入单个字符的函数fputc的原型分别为:int fgetc(FILE*fp);intfputc(intch,FILE*fp);q它们从指定流读一个字符,或向指定流写一个字符,正常情况下的返回值是所读或所写

19、的字符,遇到文件结束时fgetc返回EOF,出错时两个函数都返回EOF。15高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础通过文件读写字符串 q由于文本文件通常被划分成行,因此很有必要一次读入和写入整行数据。一行数据通常对应为一个字符串,标准库提供了fgets和fputs两个函数来支持向文件读写字符串。在调用这两个函数时,需要用一个字符数组接收输入或提供输出数据。输入函数fgets原型如下:qchar*fgets(char*str,int n,FILE*fp);qstr对应的实参应为一个字符数组,fgets从流fp关联的文件中读入至多n-1个字符存入该数组。如果在读入n-1

20、个字符前遇到换行符(n),则输入结束,换行符也存入数组。无论操作怎样完成,都会在数组的最后一个单元存入0,作为字符串的结束标记。输入正常完成时,fgets返回参数str,即返回用于保存读入数据的字符数组的首地址。遇到文件结束或操作出错时返回空指针NULL。为了保证不出现数组越界,参数n的值必须符合数组的实际情况,即n要小于等于实参数组变量的长度。q相应的输出函数fputs的原型是:qint fputs(const char*str,FILE*fp);q这个函数将str里的字符串写入到流fp关联的文件中,直至达到字符串的末尾为止。函数正常完成时返回非负值,出错时返回EOF值。16高职学院高职学院

21、 计算机教研室计算机教研室程序设计基础程序设计基础文件的格式化读写 q文件的基本格式化输入函数fscanf()函数和输出函数fprintf()的原型分别是:int fprintf(FILE*fp,const char*format,.);int fscanf(FILE*fp,const char*format,.);q它们的功能和使用分别于scanf和printf相似,只是增加了指定输入或输出流的参数。两个函数的第二个参数时格式描述字符串,与scanf和printf的格式字符串用法相同。17高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础通过文件读写二进制形式的数据 q前面三

22、节讲述了文本文件的输入输出函数,可以使用格式化读写方式向文本文件写入数值型数据,但这种写入和读出需要做数据形式转换。例如,程序需要向指定文件写一个整型变量的值,程序运行时该整型变量是以二进制形式存储在内存中,但实际写入文本文件的是一串数字字符,这种转换由格式化输出函数完成。q数据形式转换是需要时间的。如果产生的输出时给人看的,或者输入数据来自人或者文本文件,这种转换是必须的。如果把数据存入文件的目的只是为了以后取出来重新使用,例如在程序执行时装入使用,做这种转换就没有必要了。此外,数据转换有时还会丢失信息,尤其是对浮点型数据,转换时可能会产生误差,再输入又可能产生误差。为了更好的解决类似问题,

23、C语言标准库提供了二进制形式的文件读写函数,对应的输入输出函数原型如下:size_t fread(void*buffer,size_t size,size_t count,FILE*fp);size_t fwrite(const void*buffer,size_t size,size_t count,FILE*fp);q函数fwrite返回实际写入文件的数据项的个数,如果个数小于count,就说明函数执行出错了。fread返回实际从文件读入的数据项的个数,如果个数小于count,原因可能是读入时出错了,也可能是还没有读到目标数量的元素时就遇到文件结束。18高职学院高职学院 计算机教研室计算机

24、教研室程序设计基础程序设计基础文件的随机读写 q1、改变文件指针的位置qfseek函数原型:int fseek(FILE*fp,long offset,int origin);qfseek函数的作用是将文件文件指针fp移动到距离起始位置(origin)的指定位移(offset字节处)处,如果函数读写指针移动失败,返回值为-1。其中,fp为需要重新定位的文件指针,origin是移动的起始点,offset是相比于起始点的位移。系统提供了SEEK_SET、SEEK_CUR和SEEK_END三个符号常量,用于描述常用的起始点:SEEK_SET:起始点为文件的开头SEEK_CUR:起始点为文件的当前位置

25、SEEK_END:起始点为文件的末尾q下面是几个fseek函数调用的实例:fseek(fp,50L,SEEK_SET);/指针移到文件头之后的第50个字节处fseek(fp,100L,SEEK_CUR);/将置指针从当前位置向文件尾方向移动100个字节 fseek(fp,-20L,SEEK_END);/将位置指针从文件末尾向文件头方向移动20个字节 19高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础文件的随机读写q2、将文件指针重新定位到文件的开始位置qrewind函数的原型:void rewind(FILE*fp);qrewind函数将文件指针fp重新定位到文件的开始位置

26、。示例代码如下FILE*fp1;rewind(fp1);q3、获得文件指针当前位置qftell函数的原型:long ftell(FILE*fp);q其中,fp为文件指针。调用ftell函数将得到文件指针fp的当前读写位置。该值是一个长整型数,是文件指针从文件开始处到当前位置的位移字节数。如果函数的返回值为-1L,表示出错。示例代码如下:FILE*fp1;long int position;position=ftell(fp1);/取文件位置指针 20高职学院高职学院 计算机教研室计算机教研室程序设计基础程序设计基础文件操作的状态和出错检测 q由于C语言中对文件的操作都是通过调用标准库函数来实现

27、,程序中经常需要去判断相关函数调用是否成功。为此,C语言提供了两种手段来反映函数调用的情况和文件的状态。其一,由函数的返回值可以知道文件调用是否成功。其二,C语言标准库提供了对文件操作状态和操作出错的检测函数,包括:feof、ferror和clearerr等函数。q1、文件状态检测函数feof()qfeof函数的原型:int feof(FILE*fp);q函数feof用于测试文件指针fp是否已到达关联文件的末尾(文件是否结束)。如果已到达文件尾,则函数返回非值;否则返回,表示文件尚未结束。q2、报告文件操作错误状态函数ferror()qferror函数的原型:int ferror(FILE*fp);q函数ferror用于测试文件指针fp所关联的文件是否出现了错误。如果没有错误,返回值为0;否则,返回一个非0值,表示出错。q3、清除错误标志函数clearer()qclearerr函数的原型:void clearerr(FILE*fp);q函数clearerr的功能是清除文件指针fp所指的文件的错误标志,即将文件错误标志和文件结束标记置为0。21结束!结束!

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com