C语言第8章文件(重庆交大版).ppt

上传人:本田雅阁 文档编号:2102469 上传时间:2019-02-14 格式:PPT 页数:40 大小:247.01KB
返回 下载 相关 举报
C语言第8章文件(重庆交大版).ppt_第1页
第1页 / 共40页
C语言第8章文件(重庆交大版).ppt_第2页
第2页 / 共40页
C语言第8章文件(重庆交大版).ppt_第3页
第3页 / 共40页
亲,该文档总共40页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《C语言第8章文件(重庆交大版).ppt》由会员分享,可在线阅读,更多相关《C语言第8章文件(重庆交大版).ppt(40页珍藏版)》请在三一文库上搜索。

1、第8章 文 件,在程序运行时,程序本身和数据一般都存放在内存中。当程序运行结束后,存放在内存中的数据被释放。 如果需要长期保存程序运行所需的原始数据,或程序运行产生的结果,就必须以文件形式存储到外部存储介质上。,8.1 概述 8.2 标准文件操作 8.3 非标准文件操作,8.1概述,1文件与文件名 文件是指存放在外部存储介质上的数据集合。 为标识一个文件,每个文件都必须有一个文件名,其一般结构为:主文件名.扩展名 文件命名规则,遵循操作系统的约定。,2文件分类 可以从不同的角度对文件进行分类: (1)根据文件的内容,可分为程序文件和数据文件,程序文件又可分为源文件、目标文件和可执行文件。 (2

2、)根据文件的组织形式,可分为顺序存取文件和随机存取文件。 (3)根据文件的存储形式,可分为ASCII码文件和二进制文件。,3读文件与写文件 所谓读文件是指,将磁盘文件中的数据传送到计算机内存的操作。 所谓写文件是指,从计算机内存向磁盘文件中传送数据的操作。,4构成文件的基本单元与流式文件 语言将文件看作是由一个一个的字符(ASCII码文件)或字节(二进制文件)组成的。将这种文件称为流式文件。 而在其它高级语言中,组成文件的基本单位是记录,对文件操作的基本单位也是记录。,5文件类型FILE 系统给每个打开的文件都在内存中开辟一个区域,用于存放文件的有关信息(如文件名、文件位置等)。这些信息保存在

3、一个结构类型变量中,该结构类型由系统定义、取名为FILE。 注意:结构类型名“FILE”必须大写。,6ANSI C的缓冲文件系统 所谓缓冲文件系统是指,系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。 从内存向磁盘输出数据时,必须首先输出到缓冲区中。待缓冲区装满后,再一起输出到磁盘文件中。 从磁盘文件向内存读入数据时,则正好相反:首先将一批数据读入到缓冲区中,再从缓冲区中将数据逐个送到程序数据区。,8.2标准文件的操作,对文件进行操作之前,必须先打开该文件;使用结束后,应立即关闭,以免数据丢失。 语言规定了标准输入输出函数库,用fopen()函数打开一个文件,用fclose()函数关闭一

4、个文件。,文件的打开fopen()函数 1用法: FILE *fopen(“文件名“,“操作方式“); 2功能:返回一个指向指定文件的指针。 3函数原型:stdio.h 。 (1)“文件名”是指要打开(或创建)的文件名。如果使用字符数组(或字符指针),则不使用双引号。 (2)“操作方式”如表8-1所示。 例如,FILE *fp; fpfopen(“data.99“,“r“); 注:对文件操作的库函数,函数原型均在头文件stdio.h中。后续函数不再赘述。,表8-1: 文件使用方式 含 义 “r” (只读)为输入打开一个文本文件 “w” (只写)为输出打开一个文本文件 “a” (追加)向文本文件

5、尾增加数据 “rb” (只读)为输入打开一个二进制文件 “wb” (只写)为输出打开一个二进制文件 “ab“ (追加)向二进制文件尾增加数据 “r+“ (读写)为读/写打开一个文本文件 “w+” (读写)为读/写建立一个新的文本文件 “a+” (读写)为读/写打开一个文本文件 “rb+“ (读写)为读/写打开一个二进制文件 “wb+“ (读写)为读/写建立一个新的二进制文件 “ab+” (读写)为读/写打开一个二进制文件,3说明 (1)如果不能实现打开指定文件的操作,则fopen()函数返回一个空指针NULL (其值在头文件stdio.h中被定义为)。 为增强程序的可靠性,常用下面的方法打开一

6、个文件: if(fp=fopen(“文件名“,“操作方式“)=NULL) printf(“can not open this filen“); exit(0); ,关于exit()函数 1)用法:void exit(程序状态值); 2)功能:关闭已打开的所有文件,结束程序运行,返回操作系统,并将“程序状态值”返回给操作系统。当“程序状态值”为时,表示程序正常退出;非值时,表示程序出错退出。,(2)“r(b)+”与“a(b)+”的区别:使用前者打开文件时,读写位置指针指向文件头;使用后者时,读写指针指向文件尾。 (3)使用文本文件向计算机系统输入数据时,系统自动将回车换行符转换成一个换行符;在输

7、出时,将换行符转换成回车和换行两个字符。 使用二进制文件时,内存中的数据形式与数据文件中的形式完全一样,就不再进行转换。 (4)有些编译系统,可能并不完全提供上述对文件的操作方式,或采用的表示符号不同,请注意所使用系统的规定。,(5)在程序开始运行时,系统自动打开三个标准文件,并分别定义了文件指针: 1)标准输入文件stdin:指向终端输入(一般为键盘)。如果程序中指定要从stdin所指的文件输入数据,就是从终端键盘上输入数据。 2)标准输出文件stdout:指向终端输出(一般为显示器)。 3)标准错误文件stderr:指向终端标准错误输出(一般为显示器)。,文件的关闭fcolse()函数 1

8、用法: int fclose(FILE *文件指针); 2功能:关闭“文件指针”所指向的文件。如果正常关闭了文件,则函数返回值为;否则,返回值为非。 例如,fclose(fp);/*关闭fp所指向的文件*/,文件的读写操作,文件打开之后,就可以对它进行读与写的操作了。 读写文件中的一个字符 读写一个字符串 读写一个数据块 对文件进行格式化读写 读写函数的选用原则,读写文件中的一个字符,1将一个字符写到文件中fputc()函数 案例8.1 将键盘上输入的一个字符串(以“”作为结束字符),以ASCII码形式存储到一个磁盘文件中。 /*案例代码文件名:AL8_1.C*/ /*程序功能:从键盘上输入一

9、个字符串,存储到一个磁盘文件中*/ /*使用格式:可执行文件名 要创建的磁盘文件名*/ #include “stdio.h” main(int argc, char *argv) FILE *fp; char ch; if(argc!=2) /*参数个数不对*/ printf(“the number of arguments not correctnn“); printf(“Usage: 可执行文件名 filename n”); exit(1); ,if (fp=fopen(argv1,“w“)=NULL) /*打开文件失败*/ printf(“can not open this filen“

10、); exit(1); /*输入字符,并存储到指定文件中*/ for( ; (ch=getchar() != ; ) fputc(ch,fp); /*输入字符并存储到文件中*/ fclose(fp); /*关闭文件*/ 程序运行情况: abcdefg1234567,库函数fputc(): 1)用法:int fputc(字符数据,文件指针); 其中“字符数据”,既可以是字符常量,也可以是字符变量。 2)功能:将字符数据输出到“文件指针”所指向的文件中去,同时将读写位置指针向前移动1个字节(即指向下一个写入位置)。 如果输出成功,则函数返回值就是输出的字符数据;否则,返回一个符号常量EOF(其值在

11、头文件stdio.h中,被定义为-1)。,2从文件中读入一个字符fgetc()函数和feof()函数 案例8.2 顺序显示案例8.1创建的磁盘ASCII码文件。 /*案例代码文件名:AL8_2.C*/ /*程序功能:顺序显示一个磁盘ASCII码文件*/ /*参数:带参主函数,使用格式:可执行文件名 源文件名*/ #include “stdio.h“ main(int argc, char *argv) FILE *fp; char ch; if(argc!=2) /*参数个数不对*/ printf(“the number of arguments not correctn“); printf(

12、“n Usage: 可执行文件名 源文件名“); exit(1); ,if (fp=fopen(argv1,“r“)=NULL) printf(“can not open source filen“); exit(1); /*顺序输出文件的内容*/ for(; (ch=fgetc(fp)!=EOF; ) putchar(ch); /*顺序读入并显示*/ fclose(fp); /*关闭打开的文件*/ 程序运行情况: abcdefg1234567,(1)库函数fgetc() 1)用法:int fgetc(文件指针); 2)功能:从“文件指针”所指向的文件中,读入一个字符,同时将读写位置指针向前移

13、动1个字节(即指向下一个字符)。该函数无出错返回值。 例如,fgetc(fp)表达式,从文件fp中读一个字符,同时将fp的读写位置指针向前移动到下一个字符。 (2)关于符号常量EOF 在对ASCII码文件执行读入操作时,如果遇到文件尾,则读操作函数返回一个文件结束标志EOF(其值在头文件stdio.h中被定义为-1)。 在对二进制文件执行读入操作时,必须使用库函数feof()来判断是否遇到文件尾。,案例8.3 实现制作ASCII码文件副本的功能。 /*案例代码文件名:AL8_2.C*/ /*程序功能:制作ASCII码文件的副本*/ /*使用格式:可执行文件名 源文件名 目标文件名*/ #inc

14、lude “stdio.h“ main(int argc, char *argv) FILE *input, *output; /* input:源文件指针, output:目标文件指针 */ char ch; if(argc!=3) /*参数个数不对*/ printf(“the number of arguments not correctn“); printf(“n Usage: 可执行文件名 source-file dest-file“); exit(1); ,if (fp=fopen(argv1,“r“)=NULL) /*打开源文件失败*/ printf(“can not open s

15、ource filen“); exit(1); if (fp=fopen(argv2,“w“)=NULL) /*创建目标文件失败*/ printf(“can not create destination filen“); exit(1); /*复制源文件到目标文件中*/ for( ; (!feof(input) ; ) fputc(fgetc(input),output); fclose(input); fclose(output); /*关闭源文件和目标文件*/ ,库函数feof(): 1)用法:int feof(文件指针); 2)功能:在执行读文件操作时,如果遇到文件尾,则函数返回逻辑真(

16、1);否则,则返回逻辑假(0)。feof()函数同时适用于ASCII码文件和二进制文件。 例如,!feof(input)表示源文件(用于输入)未结束,循环继续。,读写一个字符串fgets()和fputs(),案例8.4 将键盘上输入的一个长度不超过80的字符串,以ASCII码形式存储到一个磁盘文件中;然后再输出到屏幕上。 /*案例代码文件名:AL8_4.C*/ /*参数:可执行文件名 要创建的磁盘文件名*/ #include “stdio.h“ main(int argc, char *argv) FILE *fp; char string81; /*字符数组用于暂存输入输出的字符串*/ if

17、(argc2) /*参数太多,提示 出错*/ printf(“Too many parametersnn“); printf(“Usage: 可执行文件名 filenamen“); exit(1); ,if(argc= =1) /*缺磁盘文件名,提示输入*/ printf(“Input the filename: “); gets(string); /*借用string暂存输入的文件名*/ argv1=(char *)malloc(strlen(string)+1);/*给文件名参数申请内存空间*/ strcpy(argv1,string);/*复制文件名到形参中*/ if (fp=fopen

18、(argv1,“w“)=NULL) /*打开文件失败*/ printf(“can not open this filen“); exit(1); /*从键盘上输入字符串,并存储到指定文件中*/ printf(“Input a string: “); gets(string); /*从键盘上输入字符串*/ fputs(string, fp); /*存储到指定文件*/ fclose(fp);,/*重新打开文件,读出其中的字符串,并输出到屏幕上*/ if (fp=fopen(argv1,“r“)=NULL) /*打开文件失败*/ printf(“can not open this filen“);

19、exit(1); fgets(string, strlen(string)+1, fp); /*从文件中读一个字符串*/ printf(“Output the string: “); puts(string); /*将字符串输出到屏幕上*/ fclose(fp); (1)为增强程序的可靠性,程序中对参数过多的情况,提示出错、并终止程序运行;而遗漏文件名时,提示用户输入。 同时,为增强程序的人机交互性,凡是需要用户输入数据的地方,都设置提示输入的信息;凡是输出数据的地方,都设置输出说明信息。,(2) 库函数fputs()向指定文件输出一个字符串 1)用法:int fputs(字符串,文件指针);

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

21、e(),实际应用中,常常要求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是存放读入数据的起始地址(即

22、存放何处)。,fwrite()从buffer开始,一次输出size个字节,重复count次, 并将输出的数据存放到fp所指向的文件中;同时,将读写位置指针向前移动size* count个字节。 其中,buffer是要输出数据在内存中的起始地址(即从何处开始输出)。 如果调用fread()或fwrite()成功,则函数返回值等于count。 fread()和fwrite()函数,一般用于二进制文件的处理。,对文件进行格式化读写fscanf()和fprintf()函数,与scanf()和printf()函数的功能相似,区别在于:fscanf()和fprintf()函数的操作对象是指定文件,而sca

23、nf()和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个空格)。,读写函数的选用原则,从功能角度来说,fread()和fwrite()函数可以完成文件的任何数据读写操作。 但为

24、方便起见,依下列原则选用: 1读/写1个字符(或字节)数据时:选用fgetc()和fputc()函数。 2读/写1个字符串时:选用fgets()和fputs()函数。 3读/写1个(或多个)不含格式的数据时:选用fread()和fwrite()函数。 4读/写1个(或多个)含格式的数据时:选用fscanf()和fprintf()函数。,位置指针与文件定位,文件中有一个读写位置指针,指向当前的读写位置。每次读写1个(或1组)数据后,系统自动将位置指针移动到下一个读写位置上。 如果想改变系统这种读写规律,可使用有关文件定位的函数。 位置指针复位函数rewind() 1用法:int rewind(文

25、件指针); 2功能:使文件的位置指针返回到文件头。 随机读写与fseek()函数 对于流式文件,既可以顺序读写,也可随机读写,关键在于控制文件的位置指针。 所谓顺序读写是指,读写完当前数据后,系统自动将文件的位置指针移动到下一个读写位置上。,所谓随机读写是指,读写完当前数据后,可通过调用fseek()函数,将位置指针移动到文件中任何一个地方。 1用法:int fseek(文件指针,位移量,参照点); 2功能:将指定文件的位置指针,从参照点开始,移动指定的字节数。 (1)参照点:用0(文件头)、1(当前位置)和(文件尾)表示。 在ANSI C标准中,还规定了下面的名字: SEEK_SET文件头,

26、 SEEK_CUR当前位置, SEEK_END文件尾 (2)位移量:以参照点为起点,向前(当位移量时)或后(当位移量时)移动的字节数。在ANSI C标准中,要求位移量为long int型数据。 fseek()函数一般用于二进制文件。,返回文件当前位置的函数ftell() 由于文件的位置指针可以任意移动,也经常移动,往往容易迷失当前位置,ftell()就可以解决这个问题。 1用法:long ftell(文件指针); 2功能:返回文件位置指针的当前位置(用相对于文件头的位移量表示)。 如果返回值为-1L,则表明调用出错。例如: offset=ftell(fp); if(offset= =-1L)p

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

28、件错误标志(即ferror()函数的值)和文件结束标志(即feof()函数的值)置为0。 对同一文件,只要出错就一直保留,直至遇到clearerr()函数或rewind()函数,或其它任何一个输入输出库函数。,非标准文件操作,非标准文件的打开、关闭 打开文件函数open 非标准文件系统使用文件号来标识文件,而不使用FILE型文件指针,使用非标准文件以前应打开,文件打开也是通过调用函数fopen来实现的。 函数原型: int open(char *filename,int mode); 函数功能:按mode指定的方式打开名为filename的文件,打开成功,函数返回一个正整数称为文件好,否则返回

29、-1 关闭函数close 函数原型: int close(int fd); 函数功能:用于关闭文件。其中,fd为文件号,是指打开时的方式。若关闭文件成功返回0,否则返回-1,非标准文件的读与写操作 读取数据函数read 函数原型: int read(int fd,void *buf,unsigned size); 函数功能:从fd所代表的文件名读入size个字节到起始地址为buf的缓冲区中。Fd是指定文件的文件号,buf为存放读入数据的存储空间的首地址,size是从文件读入的字节数,函数的返回值为实际读入的字节数,无读入数据,则操作失败,返回值为-1。 写数据函数write 函数原型: int write(int fd,void *buf,unsigned size); 函数功能:将内存中起始地址为buf的存储区中的size个字节写到fd所代表的文件中去。函数返回实际写入磁盘的字节数,若操作失败,返回值为-1,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1