您好,欢迎访问三七文档
8.1文件概述8.2文件的打开与关闭8.3文件的读写8.4文件的定位8.5文件检测函数第八章文件文件:指存储在外部介质上的有序数据的集合操作系统是以文件为单位对数据进行管理的,现代操作系统把所有外部设备都认为是文件,以便进行统一的管理。C语言认为文件是磁盘文件和其它具有输入输出(I/O)功能的外部设备(如键盘、显示器等)的总称。8.1文件概述在我们目前所编的程序中,数据通过键盘输入,存储在变量、数组或链表中,但这些数据在程序结束后就消失了。为了在程序结束后将有用的数据保存下来,就需要使用文件。计算机可以把文件长期存放在外部存储设备中,如硬盘、磁盘、光盘、U盘、磁带等,在我们需要使用数据时,从这些存储设备上读取数据8.1文件概述磁盘文件系统对文件的处理方法使用缓冲区的目的是为了减少对磁盘的实际读写次数从磁盘文件输入数据时(即读文件),先将数据送到“输入缓冲区”,再从缓冲区将数据传送给程序数据区(即传给程序中的变量)向磁盘文件输出数据时(即写文件),先将程序中变量的值送到“输出缓冲区”,等缓冲区装满后再将数据一起传送给磁盘文件磁盘程序数据区输出缓冲区输入缓冲区输出输出输入输入C语言把文件看作是一个字节的序列,根据数据的组织形式把文件分为两类:文本文件和二进制文件。8.1.1文件的分类1.文本文件(也称ASCII文件)文本文件的每一个字节存放一个字符,每个字符用一个ASCII码表示。例:整数2460在文本文件中占用4个字节,分别存放字符‘2’,‘4’,‘6’,‘0'00110010001101000011011000110000字符’2’字符’4’字符’6’字符’0’字符’2’的ASCII码值为50,25+24+21=32+16+2=50字符’4’的ASCII码值为52,25+24+22=32+16+4=52字符’6’的ASCII码值为54,25+24+22+21=32+16+4+2=54字符’0’的ASCII码值为48,25+24=32+16=482.二进制文件二进制文件则是以字节为单位存放数据的二进制代码,将存储的信息严格按其在内存中的存储形式来保存。8.1.1文件的分类例:整数2460,它在内存中的存储形式:00001001100111002460在二进制文件中的存储形式:00001001100111002460=211+28+27+24+23+22=2048+256+128+16+8+48.1.1文件的分类文本文件和二进制文件的优缺点文本文件优点:便于对字符进行处理;便于在文本编辑器中直接阅读缺点:占用存储空间较多,计算机处理数据时需要将ASCII码形式转换成二进制形式,会花费较多的时间,降低了程序的执行效率。二进制文件优点:节省存储空间,无需转换时间,程序执行效率较高缺点:不能直接输出字符形式,可读性差。struct_iobuf//VC++6.0的“stdio.h”中FILE的定义{char*_ptr;//文件输入的下一个位置int_cnt;//当前缓冲区的相对位置char*_base;//文件的起始位置int_flag;//文件标志int_file;//文件的有效性验证int_charbuf;//检查缓冲区状况,若无缓冲区则不读取int_bufsiz;//缓冲区大小char*_tmpfname;//临时文件名};typedefstruct_iobufFILE;C语言中定义了一个结构体数据类型FILE来描述文件信息8.1.2文件类型指针FILE类型中的每个成员是用来存放有关文件的各种信息的数据项。(注意:一般情况下程序员不会直接使用FILE中的成员)8.1.2文件类型指针文件指针变量的定义形式:FILE*文件指针变量名;注意:1.只有通过文件指针变量才能调用相应的文件2.在程序中若同时使用n个文件就要定义n个文件指针变量,分别对应各个文件3.FILE必须大写在程序中每一个打开的文件都必须有一个文件指针变量,该指针变量用来存储文件的基本信息,实现对文件的操作。8.1.3文件操作的基本步骤C语言中对文件的操作几乎都是通过文件处理函数来实现的,一般以f开头的函数均为文件处理函数,可以分为以下几类:文件打开与关闭函数(fopen,fclose)文件读写函数(fgetc/fputc,fread/fwrite,fscanf/fprintf等)文件定位函数(rewind,fseek等)文件检测函数(feof,ferror等)文件操作的4个基本步骤步骤1:利用“FILE”定义文件类型指针。步骤2:打开文件。步骤3:对文件进行读或写操作。步骤4:关闭文件。8.1.3文件操作的基本步骤【例8.1】将字符’A’—’Z’写入文件保存起来#includestdio.h#includestdlib.hvoidmain(){charch;FILE*fp;//定义文件指针变量;步骤1fp=fopen(letter.dat,w);//新建并打开一个文件;步骤2if(fp==NULL)//判断文件打开成功与否{printf(\nOpeningfileerror);exit(0);}for(ch='A';ch='Z';ch++)fputc(ch,fp);//将变量ch中的字符写入文件;步骤3fputc('\n',fp);//最后写入一个换行符fclose(fp);//关闭文件;步骤4}8.2.1文件的打开函数8.2文件的打开与关闭在进行文件读写操作之前要先打开文件,读写操作结束后要关闭文件。打开文件实际上是建立文件的各种有关信息,并使文件指针变量指向该文件,以便进行其它操作。函数原型:FILE*fopen(constchar*path,constchar*mode);函数参数:constchar*path——文件名称,用字符串表示constchar*mode——文件打开方式,用字符串表示函数返回值:FILE类型指针。如果成功打开文件,fopen返回文件的地址,否则返NULL。如果文件打开失败,继续操作是没有意义的,这时通常会给出一个“文件打开失败”的提示信息,然后退出程序。8.2.1文件的打开函数需要打开的文件名文件打开方式(只读)让文件指针变量指向被打开的文件例FILE*fp;fp=fopen(“file1.txt”,“r”);fopen函数的使用格式文件指针变量=fopen(文件名,文件打开方式);说明:若要打开的文件在当前目录下,可以只使用文件名;若不在当前目录下,则应该给出文件的路径。例:fp=fopen(“E:\\test\\file8_1.c,r);打开文件时,因使用方式不对或其他原因,可能会使打开文件操作失败,这时fopen函数的返回值是NULL,所以在打开文件时通常会判断一下打开操作是否成功FILE*fp;if((fp=fopen(“file1.txt”,“r”))==NULL){printf(“Cannotopenthisfile!\n”);exit(0);}说明:exit函数的作用是结束程序,并返回操作系统注意:使用exit函数要包含头文件stdlib.h8.2.1文件的打开函数文件打开方式(1)“r”与“rb”只读“r”打开一个文本文件,“rb”打开一个二进制文件以此方式打开文件,该文件必须已经存在,如不存在将出错。打开文件后只能从文件中读数据,当前读写位置位于文件开头8.2.1文件的打开函数(2)“w”与“wb”只写“w”打开一个文本文件,“wb”打开一个二进制文件以此方式打开文件时,如有同名文件(即文件已存在),则将原有文件删除并建立一个新文件;如没有同名文件(即文件不存在),则建立一个新文件。打开文件后只能向文件中写数据,当前读写位置位于文件开头8.2.1文件的打开函数(3)“a”与“ab”追加以此方式打开文件时,如文件已存在,则将当前读写位置位于文件末尾,可以追加数据;如文件不存在,则建立一个新文件。(4)“r+”与“rb+”“+”表示即能读又能写用此方式打开文件时,文件必须已经存在,否则将出错(5)“w+”与“wb+”以读/写方式打开文件,建立一个新文件。若文件已存在,则将原文件覆盖。(6)“a+”与“ab+”以读/写方式打开文件,如文件已存在,可在文件末尾追加数据;若文件不存在,则建立一个新文件说明:以“a+”或“ab+”打开已经存在的文件,若打开文件后直接写数据,则新数据添加在文件的末尾;若打开文件后直接进行读数据,则是从文件开头读取数据8.2.1文件的打开函数使用方式含义“r”以只读方式打开一个文本文件“r+”以读/写方式打开一个文本文件“w”以只写方式建立一个新的文本文件“w+”以读/写方式建立一个新的文本文件“a”向文本文件末尾追加数据“a+”以读/写方式打开一个文本文件“rb”以只读方式打开一个二进制文件“rb+”以读/写方式打开一个二进制文件“wb”以只写方式建立一个新的二进制文件“wb+”以读/写方式建立一个新的二进制文件“ab”向二进制文件末尾追加数据“ab+”以读/写方式打开一个二进制文件二进制文件文本文件8.2.2文件的关闭函数关闭文件是指断开文件指针变量与文件之间的联系,即禁止文件指针变量再对该文件进行操作。函数原型:intfclose(FILE*stream);函数参数:FILE*stream——打开文件的地址函数返回值:正常关闭时将返回0值,否则返回非0值。fclose函数的重要作用:写文件时,系统是在“输出缓冲区”满时,才将数据写入文件。当程序结束时,最后几次“写文件”的数据可能还在缓冲区中,而缓冲区还未满,如果未关闭文件就结束程序,则缓冲区的数据不能写入文件,会丢失数据。使用fclose函数,不论缓冲区是否已满,都会将缓冲区的数据写入文件,再关闭文件,从而保证文件数据的完整性。【例8.2】已知一个文本文件“file8_1.c”存储在“E:\test”目录中,将该文件的信息输出到显示器上,#includestdio.h#includestdlib.hvoidmain(){FILE*fp;charch;inti;if((fp=fopen(“E:\\test\\file8_1.c,r))==NULL){printf(文件打开失败!\n);exit(0);}do{ch=fgetc(fp);//从文件中读取一个字符赋给变量chputchar(ch);//将变量ch中的字符输出到显示器}while(ch!=EOF)//当ch!=EOF时执行循环体fclose(fp);//关闭文件}8.3文件的读写8.3.1字符读写函数1.字符读取函数函数原型:intfgetc(FILE*fp);函数参数:FILE*fp—文件指针函数功能:从fp所指向的文件中读取一个字符,字符由函数返回。返回的字符可以赋值给字符变量,也可以直接参与表达式运算。每次读取一个字符后,文件位置指针自动指向下一个字节。函数返回值:输入成功返回输入的字符;遇到文件结束,返回EOF(-1)。改进例8.2:编程将一个文本文件中全部信息显示到屏幕上#includestdio.h#includestdlib.hvoidmain(){FILE*fp;charch,filename[20];//filename存放文件名printf(Enterthefilename:);gets(filename);//输入文件名if((fp=fopen(filename,r))==NULL)//只读方式打开文件{printf(can'topenfile!\n);exit(0);}while((ch=fgetc(fp))!=EOF)putchar(ch);//将字符ch输出到显示器上fclose(fp);}8.3.1字符读写函数函数返回值:输出成功,返回输出的字符ch;输出失败,返回EOF。2.字符写入函数函数原型:intfputc(intch,FILE*fp);函数参数:intch—要写入文件的字符FILE*fp—文件指针函数功能:将ch(可以是字符常量、变量或字符表达式
本文标题:c语言PPT课件
链接地址:https://www.777doc.com/doc-4149382 .html