《第10章文件[目的要求]1掌握C文件概述2掌握文件类型指针..pdf》由会员分享,可在线阅读,更多相关《第10章文件[目的要求]1掌握C文件概述2掌握文件类型指针..pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第 10 章 文 件 目的要求 1.掌握 C 文件概述;2.掌握文件类型指针;3.掌握文件的打开与关闭;4.掌握文件的读写;5.了解文件的定位;6.了解出错的检测。基本内容 1.文件概述;2.文件类型指针;3.文件的打开与关闭;4.文件的读写;5.文件的定位;6.出错的检测。重点难点 1 重点:文件的打开与关闭。2 难点:文件的读写。课时安排 3 学时。10.1 语言文件概述 1.文件与文件名 文件是指存放在外部存储介质上的数据集合。为标识一个文件,每个文件都必须有一个文件名,其一般结构为:主文件名.扩展名 文件命名规则,遵循操作系统的约定。2.文件分类 可以从不同的角度对文件进行分类:(1)
2、根据文件的内容,可分为程序文件和数据文件,程序文件又可分为源文件、目标文件和可执行文件。(2)根据文件的组织形式,可分为顺序存取文件和随机存取文件。(3)根据文件的存储形式,可分为 ASCII码文件和二进制文件。ASCII 码文件的每一个字节存储一个字符,因而便于对字符进行逐个处理。但一般占用存储空间较多,而且要花费转换时间(二进制与 ASCII码之间的转换)。二进制文件是把内存中的数据,原样输出到磁盘文件中。可以节省存储空间和转换时间,但 一个字节并不对应一个字符,不能直接输出字符形式。3.读文件与写文件 所谓读文件是指,将磁盘文件中的数据传送到计算机内存的操作。所谓写文件是指,从计算机内存
3、向磁盘文件中传送数据的操作。4.构成文件的基本单元与流式文件 语言将文件看作是由一个一个的字符(ASCII 码文件)或字节(二进制文件)组成的。将这种文件称为流式文件。而在其它高级语言中,组成文件的基本单位是记录,对文件操作的基本单位也是记录。5.文件类型 FILE 系统给每个打开的文件都在内存中开辟一个区域,用于存放文件的有关信息(如文件名、文件位置等)。这些信息保存在一个结构类型变量中,该结构类型由系统定义、取名为 FILE。注意:结构类型名“FILE”必须大写。6.ANSI C的缓冲文件系统 所谓缓冲文件系统是指,系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。从内存向磁盘输出数据
4、时,必须首先输出到缓冲区中。待缓冲区装满后,再一起输出到磁盘文件中。从磁盘文件向内存读入数据时,则正好相反:首先将一批数据读入到缓冲区中,再从缓冲区中将数据逐个送到程序数据区。10.2 文件的打开与关闭 对文件进行操作之前,必须先打开该文件;使用结束后,应立即关闭,以免数据丢失。语言规定了标准输入输出函数库,用 fopen()函数打开一个文件,用 fclose()函数关闭一个文件。10.2.1 文件的打开fopen()函数 1.用法:FILE*fopen(文件名,操作方式);2.功能:返回一个指向指定文件的指针。3.函数原型:stdio.h。注:对文件操作的库函数,函数原型均在头文件 stdi
5、o.h 中。(1)“文件名”是指要打开(或创建)的文件名。如果使用字符数组(或字符指针),则不使用双引号。(2)“操作方式”见教材。例如,FILE*fp;fp fopen(data.99,r);4.说明 (1)如果不能实现打开指定文件的操作,则 fopen()函数返回一个空指针 NULL(其值在头文件 stdio.h 中被定义为)。为增强程序的可靠性,常用下面的方法打开一个文件:if(fp=fopen(文件名,操作方式)=NULL)printf(can not open this filen);exit(0);关于 exit()函数 1)用法:void exit(程序状态值);2)功能:关闭已
6、打开的所有文件,结束程序运行,返回操作系统,并将“程序状态值”返回给操作系统。当“程序状态值”为时,表示程序正常退出;非值时,表示程序出错退出。(2)“r(b)+”与“a(b)+”的区别:使用前者打开文件时,读写位置指针指向文件头;使用后者时,读写指针指向文件尾。(3)使用文本文件向计算机系统输入数据时,系统自动将回车换行符转换成一个换行符;在输出时,将换行符转换成回车和换行两个字符。使用二进制文件时,内存中的数据形式与数据文件中的形式完全一样,就不再进行转换。(4)有些编译系统,可能并不完全提供上述对文件的操作方式,或采用的表示符号不同,请注意所使用系统的规定。(5)在程序开始运行时,系统自
7、动打开三个标准文件,并分别定义了文件指针:1)标准输入文件-stdin:指向终端输入(一般为键盘)。如果程序中指定要从 stdin所指的文件输入数据,就是从终端键盘上输入数据。2)标准输出文件-stdout:指向终端输出(一般为显示器)。3)标准错误文件-stderr:指向终端标准错误输出(一般为显示器)。10.2.2 文件的关闭fcolse()函数 1.用法:int fclose(FILE*文件指针);2.功能:关闭“文件指针”所指向的文件。如果正常关闭了文件,则函数返回值为;否则,返回值为非。例如,fclose(fp);/*关闭 fp 所指向的文件*/10.3 文件的读写操作 文件打开之后
8、,就可以对它进行读与写的操作了。10.3.1 读写文件中的一个字符 1.将一个字符写到文件中fputc()函数 案例 10.1 将键盘上输入的一个字符串(以“”作为结束字符,以 ASCII码形式存储到一个磁盘文件中。/*程序功能:从键盘上输入一个字符串,存储到一个磁盘文件中*/*使用格式:可执行文件名 要创建的磁盘文件名*/#include“stdio.h”main(int argc,char*argv)FILE*fp;char ch;if(argc!=2)/*参数个数不对*/printf(the number of arguments not correctnn);printf(“Usage
9、:可执行文件名 filename n”);exit(0);if(fp=fopen(argv1,w)=NULL)/*打开文件失败*/printf(can not open this filen);exit(0);/*输入字符,并存储到指定文件中*/for(;(ch=getchar()!=;)fputc(ch,fp);/*输入字符并存储到文件中*/fclose(fp);/*关闭文件*/程序运行情况:abcdefg1134567 库函数 fputc():1)用法:int fputc(字符数据,文件指针);其中“字符数据”,既可以是字符常量,也可以是字符变量。2)功能:将字符数据输出到“文件指针”所指
10、向的文件中去,同时将读写位置指针向前移动 1 个字节(即指向下一个写入位置)。如果输出成功,则函数返回值就是输出的字符数据;否则,返回一个符号常量 EOF(其值在头文件 stdio.h中,被定义为-1)。2.从文件中读入一个字符fgetc()函数和 feof()函数 案例 10.2顺序显示 案例 10.1创建的磁盘 ASCII码文件。/*程序功能:顺序显示一个磁盘 ASCII 码文件*/*参数:带参主函数,使用格式:可执行文件名 源文件名*/#include stdio.h main(int argc,char*argv)FILE*fp;char ch;if(argc!=2)/*参数个数不对*
11、/printf(the number of arguments not correctn);printf(“n Usage:可执行文件名 源文件名);exit(0);if(fp=fopen(argv1,r)=NULL)printf(can not open source filen);exit(0);/*顺序输出文件的内容*/for(;(ch=fgetc(fp)!=EOF;)putchar(ch);/*顺序读入并显示*/fclose(fp);/*关闭打开的文件*/程序运行情况:abcdefg1134567 (1)库函数 fgetc()1)用法:int fgetc(文件指针);2)功能:从“文件
12、指针”所指向的文件中,读入一个字符,同时将读写位置指针向前移动1 个字节(即指向下一个字符)。该函数无出错返回值。例如,fgetc(fp)表达式,从文件 fp 中读一个字符,同时将 fp 的读写位置指针向前移动到下一个字符。(2)关于符号常量 EOF 在对 ASCII码文件执行读入操作时,如果遇到文件尾,则读操作函数返回一个文件结束标志 EOF(其值在头文件 stdio.h中被定义为-1)。在对二进制文件执行读入操作时,必须使用库函数 feof()来判断是否遇到文件尾。案例 10.3 实现制作 ASCII码文件副本的功能。/*程序功能:制作 ASCII 码文件的副本*/*使用格式:可执行文件名
13、 源文件名 目标文件名*/#include 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(0);if(fp=fopen(argv1,r)=NULL)/*打开源文件失败*/printf(can not open source filen);
14、exit(0);if(fp=fopen(argv2,w)=NULL)/*创建目标文件失败*/printf(can not create destination filen);exit(0);/*复制源文件到目标文件中*/for(;(!feof(input);)fputc(fgetc(input),output);fclose(input);fclose(output);/*关闭源文件和目标文件*/库函数 feof():1)用法:int feof(文件指针);2)功能:在执行读文件操作时,如果遇到文件尾,则函数返回逻辑真(1);否则,则返回逻辑假(0)。feof()函数同时适用于 ASCII码文
15、件和二进制文件。例如,!feof(input)表示源文件(用于输入)未结束,循环继续。10.3.2 读写一个字符串 fgets()和 fputs()案例 10.4 将键盘上输入的一个长度不超过 80 的字符串,以 ASCII 码形式存储到一个磁盘文件中;然后再输出到屏幕上。/*参数:可执行文件名 要创建的磁盘文件名*/#include stdio.h main(int argc,char*argv)FILE*fp;char string81;/*字符数组用于暂存输入输出的字符串*/if(argc2)/*参数太多,提示 出错*/printf(Too many parametersnn);prin
16、tf(Usage:可执行文件名 filenamen);exit(0);if(argc=1)/*缺磁盘文件名,提示输入*/printf(Input the filename:);gets(string);/*借用 string 暂存输入的文件名*/argv1=(char*)malloc(strlen(string)+1);/*给文件名参数申请内存空间*/strcpy(argv1,string);/*复制文件名到形参中*/if(fp=fopen(argv1,w)=NULL)/*打开文件失败*/printf(can not open this filen);exit(0);/*从键盘上输入字符串,并
17、存储到指定文件中*/printf(Input a string:);gets(string);/*从键盘上输入字符串*/fputs(string,fp);/*存储到指定文件*/fclose(fp);/*重新打开文件,读出其中的字符串,并输出到屏幕上*/if(fp=fopen(argv1,r)=NULL)/*打开文件失败*/printf(can not open this filen);exit(0);fgets(string,strlen(string)+1,fp);/*从文件中读一个字符串*/printf(Output the string:);puts(string);/*将字符串输出到屏
18、幕上*/fclose(fp);(1)为增强程序的可靠性,程序中对参数过多的情况,提示出错、并终止程序运行;而遗漏文件名时,提示用户输入。同时,为增强程序的人机交互性,凡是需要用户输入数据的地方,都设置提示输入的信息;凡是输出数据的地方,都设置输出说明信息。(2)库函数 fputs()向指定文件输出一个字符串 1)用法:int fputs(字符串,文件指针);其中“字符串”可以是一个字符串常量,或字符数组名,或字符指针变量名。2)功能:向指定文件输出一个字符串,同时将读写位置指针向前移动 strlength(字符串长度)个字节。如果输出成功,则函数返回值为;否则,为非值。(3)库函数 fgets()从文件中读一个字符串 1)用法:char*fgets(指针,串长度+1,文件指针);2)功能:从指定文件中读入一个字符串,存入“字符数组指针”中,并在尾端自动加一个结束标志0;同时,将读写位置指针向前移动 strlength(字符串长度)个字节。如果在读入规定长度之前遇到文件尾 EOF或换行符,读入即结束。