在程序运行时.ppt_第1页
在程序运行时.ppt_第2页
在程序运行时.ppt_第3页
在程序运行时.ppt_第4页
在程序运行时.ppt_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、第13章文件,在程序运行时,程序本身和数据一般都存放在内存中。当程序运行结束后,存放在内存中的数据被释放。如果需要长期保存程序运行所需的原始数据,或程序运行产生的结果,就必须以文件形式存储到外部存储介质上。13.1文件概述13.2文件类型指针13.3文件的打开与关闭13.4文件的读写13.5文件定位13.6出错的检测,13.1文件概述,1文件与文件名文件是指存放在外部存储介质上的数据集合。为标识一个文件,每个文件都必须有一个文件名,其一般结构为:主文件名.扩展名文件命名规则,遵循操作系统的约定。2文件分类可以从不同的角度对文件进行分类:(1)根据文件的内容,可分为程序文件和数据文件,程序文件又

2、可分为源文件、目标文件和可执行文件。(2)根据文件的组织形式,可分为顺序存取文件和随机存取文件。,(3)根据文件的存储形式,可分为ASCII码文件和二进制文件。ASCII码文件的每1个字节存储1个字符,因而便于对字符进行逐个处理。但一般占用存储空间较多,而且要花费转换时间(二进制与ASCII码之间的转换)。二进制文件是把内存中的数据,原样输出到磁盘文件中。可以节省存储空间和转换时间,但1个字节并不对应1个字符,不能直接输出字符形式。3读文件与写文件所谓读文件是指,将磁盘文件中的数据传送到计算机内存的操作。所谓写文件是指,从计算机内存向磁盘文件中传送数据的操作。,4构成文件的基本单元与流式文件语

3、言将文件看作是由一个一个的字符(ASCII码文件)或字节(二进制文件)组成的。将这种文件称为流式文件。而在其它高级语言中,组成文件的基本单位是记录,对文件操作的基本单位也是记录。5ANSIC的缓冲文件系统所谓缓冲文件系统是指,系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。从内存向磁盘输出数据时,必须首先输出到缓冲区中。待缓冲区装满后,再一起输出到磁盘文件中。从磁盘文件向内存读入数据时,则正好相反:首先将一批数据读入到缓冲区中,再从缓冲区中将数据逐个送到程序数据区。,13.2文件类型指针,文件类型FILE系统给每个打开的文件都在内存中开辟一个区域,用于存放文件的有关信息(如文件名、文件位

4、置等)。这些信息保存在一个结构类型变量中,该结构类型由系统定义、取名为FILE。注意:结构类型名“FILE”必须大写。利用文件类型定义文件类型指针变量,文件的操作可以通过文件类型指针变量进行。文件类型指针变量的定义方法为:FILE*指针变量名;,13.3文件的打开与关闭,对文件进行操作之前,必须先打开该文件;使用结束后,应立即关闭,以免数据丢失。语言规定了标准输入输出函数库,用fopen()函数打开一个文件,用fclose()函数关闭一个文件。13.3.1文件的打开fopen()函数1用法:FILE*fopen(文件名,操作方式);2功能:返回一个指向指定文件的指针。3函数原型:stdio.h

5、。注:对文件操作的库函数,函数原型均在头文件stdio.h中。后续函数不再赘述。,(1)“文件名”是指要打开(或创建)的文件名。如果使用字符数组(或字符指针),则不使用双引号。(2)“操作方式”如表13.1所示。例如,FILE*fp;fpfopen(data.99,r);3说明(1)以“r”方式打开的文件只能读不能写,(2)以“w”方式打开的文件只能写不能读。(3)“r(b)+”与“a(b)+”的区别:使用前者打开文件时,读写位置指针指向文件头;使用后者时,读写指针指向文件尾。(4)以“r+”,“w+”,“a+”方式打开的文件则可读可写。,(5)如果不能实现打开指定文件的操作,则fopen()

6、函数返回一个空指针NULL(其值在头文件stdio.h中被定义为)。为增强程序的可靠性,常用下面的方法打开一个文件:if(fp=fopen(文件名,操作方式)=NULL)printf(cannotopenthisfilen);exit(0);(6)有些编译系统,可能并不完全提供上述对文件的操作方式,或采用的表示符号不同,请注意所使用系统的规定。,(7)使用文本文件向计算机系统输入数据时,系统自动将回车换行符转换成一个换行符;在输出时,将换行符转换成回车和换行两个字符。使用二进制文件时,内存中的数据形式与数据文件中的形式完全一样,就不再进行转换。(8)在程序开始运行时,系统自动打开三个标准文件,

7、并分别定义了文件指针:1)标准输入文件stdin:指向终端输入(一般为键盘)。如果程序中指定要从stdin所指的文件输入数据,就是从终端键盘上输入数据。2)标准输出文件stdout:指向终端输出(一般为显示器)。3)标准错误文件stderr:指向终端标准错误输出(一般为显示器)。,13.3.3文件的关闭fcolse()函数1用法:intfclose(FILE*文件指针);2功能:关闭“文件指针”所指向的文件。如果正常关闭了文件,则函数返回值为;否则,返回值为非。例如,fclose(fp);/*关闭fp所指向的文件*/,13.4.1fputc函数和fgetc函数,1,fputc函数(1)调用形式

8、:fputc(字符数据,文件指针);其中“字符数据”,既可以是字符常量,也可以是字符变量。(2)功能:将字符数据输出到“文件指针”所指向的文件中去,同时将读写位置指针向前移动1个字节(即指向下一个写入位置)。如果输出成功,则函数返回值就是输出的字符数据;否则,返回一个符号常量EOF(其值在头文件stdio.h中,被定义为-1),2fgetc函数(1)调用形式:fgetc(文件指针);(2)功能:从“文件指针”所指向的文件中,读入一个字符,同时将读写位置指针向前移动1个字节(即指向下一个字符)。该函数无出错返回值。例如,fgetc(fp)表达式,从文件fp中读一个字符,同时将fp的读写位置指针向

9、前移动到下一个字符。关于符号常量EOF在对ASCII码文件执行读入操作时,如果遇到文件尾,则读操作函数返回一个文件结束标志EOF(其值在头文件stdio.h中被定义为-1)。在对二进制文件执行读入操作时,必须使用库函数feof()来判断是否遇到文件尾。,3,fputc函数和fgetc函数使用举例例13.1从键盘输入的一些字符,逐个把它们送入磁盘文件上,直到输入一个“”为止。#includemain()FILE*fp;charch,filename10;scanf(%s,filename);if(fp=fopen(filename,w)=NULL)printf(cannotopenfilen);

10、exit(0);getchar();ch=getchar();while(ch!=#)fputc(ch,fp);putchar(ch);ch=getchar();fclose(fp);,例13.2将一个磁盘文件中的信息复制到另一人磁盘文件中#includemain()FILE*in,*out;charch,infile10,outfile10;printf(entertheinfilename:n);scanf(%s,infile);printf(entertheoutfilename:n);scanf(%s,outfile);if(in=fopen(infile,r)=NULL)printf

11、(cannotopenfilen);exit(0);if(out=fopen(outfile,w)=NULL)printf(cannotopenfilen);exit(0);while(!feof(in)fputc(fgetc(in),out);fclose(in);fclose(out);,13.4.2fread()和fwrite()函数(读写一个数据块),实际应用中,常常要求1次读写1个数据块。为此,ANSIC标准设置了fread()和fwrite()函数。1用法:intfread(void*buffer,intsize,intcount,FILE*fp);intfwrite(void*b

12、uffer,intsize,intcount,FILE*fp);2功能:fread()从fp所指向文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放到从buffer开始的内存中;同时,将读写位置指针向前移动size*count个字节。其中,buffer是存放读入数据的起始地址(即存放何处)。,fwrite()从buffer开始,一次输出size个字节,重复count次,并将输出的数据存放到fp所指向的文件中;同时,将读写位置指针向前移动size*count个字节。其中,buffer是要输出数据在内存中的起始地址(即从何处开始输出)。如果调用fread()或fwri

13、te()成功,则函数返回值等于count。fread()和fwrite()函数,一般用于二进制文件的处理。,13.4.3fscanf()和fprintf()函数(对文件进行格式化读写),与scanf()和printf()函数的功能相似,区别在于:fscanf()和fprintf()函数的操作对象是指定文件,而scanf()和printf()函数的操作对象是标准输入(stdin)输出(stdout)文件。intfscanf(文件指针,格式符,输入变量首地址表);intfprintf(文件指针,格式符,输出参量表);例如,.inti=3;floatf=9.80;.fprintf(fp,%2d,%6

14、.2f,i,f);.fprintf()函数的作用是,将变量i按%2d格式、变量f按%6.2f格式,以逗号作分隔符,输出到fp所指向的文件中:3,9.80(表示1个空格)。,1.putw和getw函数putw(int,FILE*)用于将整数输出到文件中getw(FILE*)用于从文件中读取一个整数,13.4.4其他读写函数,2.fgets函数与fputs函数向指定文件输出一个字符串intfputs(字符串,文件指针);其中“字符串”可以是一个字符串常量,或字符数组名,或字符指针变量名。功能:向指定文件输出一个字符串,同时将读写位置指针向前移动strlength(字符串长度)个字节。如果输出成功,

15、则函数返回值为;否则,为非值。char*fgets(指针,串长度+1,文件指针);功能:从指定文件中读入一个字符串,存入“字符数组指针”中,并在尾端自动加一个结束标志0;同时,将读写位置指针向前移动strlength(字符串长度)个字节。如果在读入规定长度之前遇到文件尾EOF或换行符,读入即结束。,从功能角度来说,fread()和fwrite()函数可以完成文件的任何数据读写操作。但为方便起见,依下列原则选用:1读/写1个字符(或字节)数据时:选用fgetc()和fputc()函数。2读/写1个字符串时:选用fgets()和fputs()函数。3读/写1个(或多个)不含格式的数据时:选用fre

16、ad()和fwrite()函数。4读/写1个(或多个)含格式的数据时:选用fscanf()和fprintf()函数。,13.5文件的定位,文件中有一个读写位置指针,指向当前的读写位置。每次读写1个(或1组)数据后,系统自动将位置指针移动到下一个读写位置上。如果想改变系统这种读写规律,可使用有关文件定位的函数。13.5.1rewind函数(位置指针复位函数)1用法:intrewind(文件指针);2功能:使文件的位置指针返回到文件头。13.5.2fseek()函数和随机读写对于流式文件,既可以顺序读写,也可随机读写,关键在于控制文件的位置指针。所谓顺序读写是指,读写完当前数据后,系统自动将文件的

17、位置指针移动到下一个读写位置上。,所谓随机读写是指,读写完当前数据后,可通过调用fseek()函数,将位置指针移动到文件中任何一个地方。1用法:intfseek(文件指针,位移量,参照点);2功能:将指定文件的位置指针,从参照点开始,移动指定的字节数。(1)参照点:用0(文件头)、1(当前位置)和(文件尾)表示。在ANSIC标准中,还规定了下面的名字:SEEK_SET文件头,SEEK_CUR当前位置,SEEK_END文件尾(2)位移量:以参照点为起点,向前(当位移量时)或后(当位移量时)移动的字节数。在ANSIC标准中,要求位移量为longint型数据。fseek()函数一般用于二进制文件。,

18、13.5.3ftell()函数返回文件当前位置的函数由于文件的位置指针可以任意移动,也经常移动,往往容易迷失当前位置,ftell()就可以解决这个问题。1用法:longftell(文件指针);2功能:返回文件位置指针的当前位置(用相对于文件头的位移量表示)。如果返回值为-1L,则表明调用出错。例如:offset=ftell(fp);if(offset=-1L)printf(“ftell()errorn”);,13.6出错检测,13.6.1ferror()函数在调用输入输出库函数时,如果出错,除了函数返回值有所反映外,也可利用ferror()函数来检测。1用法:intferror(文件指针);2功能:如果函

温馨提示

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

评论

0/150

提交评论