1 / 25

第 1 3 章 文 件

第 1 3 章 文 件. 在程序运行时,程序本身和数据一般都存放在内存中。当程序运行结束后,存放在内存中的数据被释放。 如果需要长期保存程序运行所需的原始数据,或程序运行产生的结果,就必须以文件形式存储到外部存储介质上。 13.1 C文件概述 13.2 文件类型指针 13.3 文件的打开与关闭 13.4 文件的读写 13.5 文件定位 13.6 出错的检测. 1 3 .1 C文件概述. 1 .文件与文件名 文件是指存放在外部存储介质上的数据集合。

fox
Download Presentation

第 1 3 章 文 件

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第13章文件 在程序运行时,程序本身和数据一般都存放在内存中。当程序运行结束后,存放在内存中的数据被释放。 如果需要长期保存程序运行所需的原始数据,或程序运行产生的结果,就必须以文件形式存储到外部存储介质上。 13.1 C文件概述 13.2 文件类型指针 13.3 文件的打开与关闭 13.4 文件的读写 13.5 文件定位 13.6 出错的检测

  2. 13.1 C文件概述 1.文件与文件名文件是指存放在外部存储介质上的数据集合。 为标识一个文件,每个文件都必须有一个文件名,其一般结构为:主文件名[.扩展名]文件命名规则,遵循操作系统的约定。 2.文件分类 可以从不同的角度对文件进行分类: (1)根据文件的内容,可分为程序文件和数据文件,程序文件又可分为源文件、目标文件和可执行文件。 (2)根据文件的组织形式,可分为顺序存取文件和随机存取文件。

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

  4. 4.构成文件的基本单元与流式文件 C语言将文件看作是由一个一个的字符(ASCII码文件)或字节(二进制文件)组成的。将这种文件称为流式文件。 而在其它高级语言中,组成文件的基本单位是记录,对文件操作的基本单位也是记录。 5.ANSI C的缓冲文件系统 所谓缓冲文件系统是指,系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。 从内存向磁盘输出数据时,必须首先输出到缓冲区中。待缓冲区装满后,再一起输出到磁盘文件中。 从磁盘文件向内存读入数据时,则正好相反:首先将一批数据读入到缓冲区中,再从缓冲区中将数据逐个送到程序数据区。

  5. 13.2 文件类型指针 文件类型FILE  系统给每个打开的文件都在内存中开辟一个区域,用于存放文件的有关信息(如文件名、文件位置等)。这些信息保存在一个结构类型变量中,该结构类型由系统定义、取名为FILE。 注意:结构类型名“FILE”必须大写。   利用文件类型定义文件类型指针变量,文件的操作可以通过文件类型指针变量进行。   文件类型指针变量的定义方法为: FILE  *指针变量名;

  6. 13.3文件的打开与关闭 对文件进行操作之前,必须先打开该文件;使用结束后,应立即关闭,以免数据丢失。 C语言规定了标准输入输出函数库,用fopen()函数打开一个文件,用fclose()函数关闭一个文件。 13.3.1 文件的打开──fopen()函数 1.用法: FILE *fopen("文件名","操作方式"); 2.功能:返回一个指向指定文件的指针。 3.函数原型:stdio.h 。 注:对文件操作的库函数,函数原型均在头文件stdio.h中。后续函数不再赘述。

  7. (1)“文件名”是指要打开(或创建)的文件名。如果使用字符数组(或字符指针),则不使用双引号。(1)“文件名”是指要打开(或创建)的文件名。如果使用字符数组(或字符指针),则不使用双引号。 (2)“操作方式”如表13.1所示。 例如,FILE *fp; fp=fopen("data.99","r"); 3.说明 (1)以“r”方式打开的文件只能读不能写, (2)以“w”方式打开的文件只能写不能读。 (3)“r(b)+”与“a(b)+”的区别:使用前者打开文件时,读写位置指针指向文件头;使用后者时,读写指针指向文件尾。 (4)以“r+”,“w+”,“a+”方式打开的文件则可读可写。

  8. (5)如果不能实现打开指定文件的操作,则fopen()函数返回一个空指针NULL (其值在头文件stdio.h中被定义为0)。 为增强程序的可靠性,常用下面的方法打开一个文件: if((fp=fopen("文件名","操作方式"))==NULL) { printf("can not open this file\n"); exit(0); } (6)有些C编译系统,可能并不完全提供上述对文件的操作方式,或采用的表示符号不同,请注意所使用系统的规定。

  9. (7)使用文本文件向计算机系统输入数据时,系统自动将回车换行符转换成一个换行符;在输出时,将换行符转换成回车和换行两个字符。(7)使用文本文件向计算机系统输入数据时,系统自动将回车换行符转换成一个换行符;在输出时,将换行符转换成回车和换行两个字符。 使用二进制文件时,内存中的数据形式与数据文件中的形式完全一样,就不再进行转换。 (8)在程序开始运行时,系统自动打开三个标准文件,并分别定义了文件指针: 1)标准输入文件——stdin:指向终端输入(一般为键盘)。如果程序中指定要从stdin所指的文件输入数据,就是从终端键盘上输入数据。 2)标准输出文件——stdout:指向终端输出(一般为显示器)。 3)标准错误文件——stderr:指向终端标准错误输出(一般为显示器)。

  10. 13.3.3 文件的关闭──fcolse()函数 1.用法: int fclose(FILE *文件指针); 2.功能:关闭“文件指针”所指向的文件。 如果正常关闭了文件,则函数返回值为0;否则,返回值为非0。 例如,fclose(fp);/*关闭fp所指向的文件*/

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

  12. 2 fgetc函数 (1)调用形式: fgetc(文件指针); (2)功能:从“文件指针”所指向的文件中,读入一个字符,同时将读写位置指针向前移动1个字节(即指向下一个字符)。该函数无出错返回值。 例如,fgetc(fp)表达式,从文件fp中读一个字符,同时将fp的读写位置指针向前移动到下一个字符。 关于符号常量EOF 在对ASCII码文件执行读入操作时,如果遇到文件尾,则读操作函数返回一个文件结束标志EOF(其值在头文件stdio.h中被定义为-1)。 在对二进制文件执行读入操作时,必须使用库函数feof()来判断是否遇到文件尾。

  13. 3,fputc函数和fgetc函数使用举例 例13.1 从键盘输入的一些字符,逐个把它们送入磁盘文件上,直到输入一个“#”为止。 #include<stdio.h> main() {FILE *fp; char ch, filename[10]; scanf("%s",filename); if((fp=fopen(filename,"w"))==NULL) {printf("cannot open file\n"); exit(0);} getchar(); ch=getchar(); while(ch!='#') {fputc(ch,fp); putchar(ch); ch=getchar();} fclose(fp);}

  14. 例13.2 将一个磁盘文件中的信息复制到另一人磁盘文件中例13.2 将一个磁盘文件中的信息复制到另一人磁盘文件中 #include<stdio.h> main() {FILE *in, *out; char ch, infile[10],outfile[10]; printf("enter the infile name:\n"); scanf("%s",infile); printf("enter the outfile name:\n"); scanf("%s",outfile); if((in=fopen(infile,"r"))==NULL) {printf("cannot open file\n"); exit(0);} if((out=fopen(outfile,"w"))==NULL) {printf("cannot open file\n"); exit(0);} while(!feof(in)) fputc(fgetc(in), out); fclose(in); fclose(out); }

  15. 13.4.2 fread()和fwrite()函数(读/写一个数据块) 实际应用中,常常要求1次读/写1个数据块。为此,ANSI C 标准设置了 fread( ) 和fwrite()函数。 1.用法: int fread(void *buffer,int size,int count,FILE *fp); int fwrite(void *buffer,int size,int count,FILE *fp); 2.功能: fread()──从fp所指向文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放到从buffer开始的内存中;同时,将读写位置指针向前移动size* count个字节。 其中,buffer是存放读入数据的起始地址(即存放何处)。

  16. fwrite()──从buffer开始,一次输出size个字节,重复count次, 并将输出的数据存放到fp所指向的文件中;同时,将读写位置指针向前移动size* count个字节。 其中,buffer是要输出数据在内存中的起始地址(即从何处开始输出)。 如果调用fread()或fwrite()成功,则函数返回值等于count。 fread()和fwrite()函数,一般用于二进制文件的处理。

  17. 13.4.3 fscanf()和fprintf()函数(对文件进行格式化读/写) 与scanf()和printf()函数的功能相似,区别在于:fscanf()和fprintf()函数的操作对象是指定文件,而scanf()和printf()函数的操作对象是标准输入(stdin)输出(stdout)文件。 int fscanf(文件指针,"格式符",输入变量首地址表); int fprintf(文件指针,"格式符",输出参量表); 例如,...... int i=3; float f=9.80; ...... fprintf(fp,"%2d,%6.2f", i, f); ...... fprintf()函数的作用是,将变量i按%2d格式、变量f按%6.2f格式, 以逗号作分隔符,输出到fp所指向的文件中:□3,□□9.80(□表示1个空格)。

  18. 13.4.4 其他读写函数 1.putw和getw函数 putw(int,FILE*) 用于将整数输出到文件中 getw(FILE *) 用于从文件中读取一个整数

  19. 2 . fgets函数与fputs函数──向指定文件输出一个字符串 int fputs(字符串,文件指针); 其中“字符串”可以是一个字符串常量,或字符数组名,或字符指针变量名。 功能:向指定文件输出一个字符串,同时将读写位置指针向前移动strlength(字符串长度)个字节。如果输出成功,则函数返回值为0;否则,为非0值。 char *fgets(指针,串长度+1,文件指针); 功能:从指定文件中读入一个字符串,存入“字符数组/指针”中,并在尾端自动加一个结束标志'\0';同时,将读写位置指针向前移动strlength(字符串长度)个字节。 如果在读入规定长度之前遇到文件尾EOF或换行符,读入即结束。

  20. 从功能角度来说,fread()和fwrite()函数可以完成文件的任何数据读/写操作。 但为方便起见,依下列原则选用: 1.读/写1个字符(或字节)数据时:选用fgetc()和fputc()函数。 2.读/写1个字符串时:选用fgets()和fputs()函数。 3.读/写1个(或多个)不含格式的数据时:选用fread()和fwrite()函数。 4.读/写1个(或多个)含格式的数据时:选用fscanf()和fprintf()函数。

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

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

  23. 13.5.3 ftell()函数 返回文件当前位置的函数 由于文件的位置指针可以任意移动,也经常移动,往往容易迷失当前位置,ftell()就可以解决这个问题。 1.用法:long ftell(文件指针); 2.功能:返回文件位置指针的当前位置(用相对于文件头的位移量表示)。 如果返回值为-1L,则表明调用出错。例如: offset=ftell(fp); if(offset= =-1L)printf(“ftell() error\n”);

  24. 13.6 出错检测 13.6.1 ferror()函数在调用输入输出库函数时,如果出错,除了函数返回值有所反映外,也可利用ferror()函数来检测。1.用法: int ferror(文件指针); 2.功能:如果函数返回值为0,表示未出错;如果返回一个非0值,表示出错。 (1)对同一文件,每次调用输入输出函数均产生一个新的ferror()函数值。因此在调用了输入输出函数后,应立即检测,否则出错信息会丢失。 (2)在执行fopen()函数时,系统将ferror()的值自动置为0。

  25. 13.6.2 clearerr()函数 1.用法: void clearerr(文件指针); 2.功能:将文件错误标志(即ferror()函数的值)和文件结束标志(即feof()函数的值)置为0。 对同一文件,只要出错就一直保留,直至遇到clearerr()函数或rewind()函数,或其它任何一个输入输出库函数。

More Related