项目8项目中学生数据的存储与重用.ppt_第1页
项目8项目中学生数据的存储与重用.ppt_第2页
项目8项目中学生数据的存储与重用.ppt_第3页
项目8项目中学生数据的存储与重用.ppt_第4页
项目8项目中学生数据的存储与重用.ppt_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

项目8 技能目标 n能用fopen函数和fclose函数打开和关闭文件 n能正确地读写文件 n能用文件定位函数对文件进行正确的定位操作 n能用格式化读写函数读写数据 知识目标 n理解文件的概念、作用和文件的类型 n理解文件指针的概念和定义方法 n理解并掌握字符、字符串、数据块、格式 化文件读写函数的格式 n理解文件定位函数的功能和使用方法 项目任务与解析 n n 使用文件进行学生数据的读写。使用文件进行学生数据的读写。 n n 本项目包含下面本项目包含下面1 1个任务:个任务: 任务任务2020:学生信息的保存:学生信息的保存 任务任务2121:学生信息文件的打开:学生信息文件的打开 主要内容 8.1 任务20:学生信息的保存 8.2 任务21:学生信息文件的打开 8.3 必备知识与理论 8.4 扩展知识与理论 1. 问题描述 学生属性是用结构体类型来实现的,首先定义学生数组 长度、再定义学生信息结构体类型、最后定义能存储40 个学生信息的数组和记录当前学生数的整型变量。 2. 具体实现 学生信息保存在一个名为stuscore的文件中,以二进制 文件的形式保存,保存的学生数由形参size决定,用写 数据块函数实现保存,保存文件成功后给出提示。 P240程序 3. 知识分析 使用文件来对学生信息进行保存。 8.1 8.1 任务任务2020:学生信息的保存:学生信息的保存 1. 问题描述 该函数用读数据块函数打开保存在 stuscore文件中的学生信息,文件中的学 生数由形参指针变量size返回。 2. 具体实现 P241-P242程序 3. 知识分析 对保存在文件中的学生信息进行读取。 8.2 8.2 任务任务2121:学生信息文件的打开:学生信息文件的打开 8.3.1 文件及其分类 文件(file)是一种组织外部介质上的数据的数据类 型。它有两个特征:一是对一个数据集合可以用一个名 字命名;二是保存在外部介质上,例如磁带、磁盘、光 盘、U盘上,可以长期保存。例如用文字处理软件(如 WPS或Word)写好的一篇文章,把它起一个名字存放到 磁盘上就是一个文件。 与程序设计有关的文件,按内容来分,有:源程序文 件、目标程序文件、可执行程序文件和数据文件等。本 章主要讨论数据文件,即如何将程序处理的数据组织成 文件保存到外部介质上,以及息怎样从外部介质上读取 这些数据。 8.3 8.3 必备知识与理论必备知识与理论 二进制文件是指以数据在内存中存储形式原样输出到 磁盘上去。例如50201,在例7.18中知道50201二进制 表示为0110000101000001。字符代码文件是指文件的 内容是由一个一个字符组成的,每一个字符用一个代码 表示,一般用ASCII代码,例如50201,共有5个字符, 每个字符占一个字节,故共占5个字节。图8.2为两种这 存储形式。 一般说,二进制文件节省存储空间而且输入输出的速 度快(因为在输出时不需要把数据由二进制形式转换为字 符代码,在输入时也不需要把字符代码先转换成二进制 形式然后存入内存)。如果存入磁盘中的数据只是暂存的 中间结果数据,以后还要调入继续处理的,一般用二进 制文件以节省时间和空间。如果输出的数据是准备作为 文档供给人们阅读的,一般用字符代码文件,它们通过 显示器或打印机转换成字符输出。一般高级语言都能提 供字符代码文件(ASCII文件)和二进制文件,用不同的方 法来读写这两种不同的文件。 8.3.2 文件名 一个文件必须有一个文件名。文件名包括三部分:文 件路径、文件名主干和文件名后缀。 文件路径表明文件的存储位置。在操作系统中用反斜 杠符()作为目录、子目录、文件之间的分隔。如 f:exe3file1.txt 表明文件file1.txt保存在f盘中的exe3目录(文件夹) 中。 但是,在C语言程序中,由于反斜杠符()是作为转义 字符的起始符号,因此如果想用反斜杠符时要用两个反 斜杠符表示。即要写成 f:exe3file1.txt 文件名是文件的主要标志,它必须符合C语言关于标 识符的规定。 文件名后缀,用于对文件进行补充说明,一般不超过 三个字符,通常用特定的后缀表明文件的类型。例如.txt 表明是纯字符文件,用.c表示是C语言源程序文件,用 .exe表示是可执行文件等。 8.3.3 文件的位置指针与读写方式 为了进行读写,系统要为每个文件设置一个位 置指针,用于指向当前的读写位置。文件的位 置指针的初始值可以按照程序员要进行的操作 自动初始化: 当要进行读或写时,文件的位置指针的初始值 为文件头。 当要为文件追加数据时,文件的位置指针指向 文件尾。 在ASCII文件中,通常,每进行一次读或写, 位置指针就自动加1,指向下一个字符位置,为 下一次读或写作准备,形成顺序读写方式。 为了方便使用,C语言允许人为地移动位置指 针,使位置指针跳动一个距离,或返回到文件 头,形成文件的随机读写方式。 8.3.4 FILE类型指针 FILE类型 结构体类型 2. FILE类型指针 FILE *fp; 3. 标准文件 sdtin、stdout、stderr 8.3.5 流 对文件的操作是高级语言的一种重要功能。 由于对文件的操作要与各种外部设备发生联系 ,而所有外部设备都是由操作系统统一管理的 ,因此对文件的输入输出过程是通过操作系统 来实现的。 程序对文件的操作(读/写)过程如下页图所示 。进行文件的读写,首先要为文件建立一个相 应的缓冲区。当要向文件写据时,程序先把数 据送到缓冲区,再把数据送到外部设备的指定 文件中;当要从文件读取数据时,也要先把数 据送到缓冲区,再由变量从缓冲区中提取相应 的数据。 程序数据区 输入缓冲区 输出缓冲区 外部介质 缓冲区可以由系统自动为每个文件设置,也 可以由程序员自己设置。采用前者的系统称为 缓冲文件系统,而由用户自己根据需要设置缓 冲区的系统称为非缓冲文件系统。ANSI C只建 议使用缓冲文件系统,并对缓冲文件系统的功 能进行了扩充,使之既能用于处理字符代码文 件,也能处理二进制文件。 在现代操作系统中,考虑到一个计算机系统 要使用许多外部设备,如键盘、显示器、打印 机、磁盘等。为了使简化用户对这些设备的操 作,使用户不必具体考虑设备间的差异,可以 将设备缓冲区应用程序之间的输入输出过 程抽象为“数据的流动”,并称为“流”(stream) 。这样就可以使用统一的流处理函数进行设备( 文件)的操作了。 流包含了设备(文件)、缓冲区以及操作性质、 状态等。要进行文件操作,首先要建立一个流 。 建立了与文件相应的流,与该文件相 应的文件结构体变量(即文件的信息区)才 会有具体的值,FILE类型的指针也就会指 向相应的文件的结构体变量。下图为三个 FILE类型的指针指向对应的文件信息区( 结构体变量)的示意图。所以文件指针和 流是C语言文件系统的两个很重要的概念 。 文件1 的信息 区 fp1文件2 的信息 区 fp2文件3 的信息 区 fp3 8.3.6 文件的打开与关闭流的创建与撤销 文件的打开 fopen (文件名,文件操作方式); 说明: (1)文件名应当包含文件路径、主文件 名和文件后缀,即提供找到文件的有关信 息。 (2)应当理解文件操作方式的意义。 操作方式 操作方式符号 对文本文件对二进制文件 读打开rrb 写生成wwb 追加aab 读写打开r+rb+/r+b 读写生成w+wb+/w+b 读写追加a+ab+/a+b (3)fopen()执行成功,则返回一个FILE类型 的指针值;如果执行失败(如文件不存在、设 备故障、磁盘满等原因),则返回一个NULL值 。通常把该函数的返回值赋值给一个FILE类型 的指针变量,后面就可以使用这个指针变量对 文件进行操作。因此常用下面的方法打开一个 文件。 FILE * fp; if (fp=fopen(“file1”,”r”)=NULL) printf(“cannot open this filen”); exit(1); (4)对磁盘文件,在使用前先要打开,而对终 端设备,尽管它们也作为文件来处理,但为什么 在前面的程序中从未使用过“打开文件”的操作呢? 这是由于在程序运行时,系统自动地打开三个标 准文件:标准输入,标准输出和标准出错输出。 系统自动地定义了三个指针变量:stdin,stdout和 stderr,分别指向标准输入、标准输出和标准出 错输出。这三个文件都是以终端设备作为输入输 出对象的。如果指定输出一个数据到stdout所指 向的文件,就是指输出到终端设备。为使用方便 ,允许在程序中不指定这三个文件,也就是说, 系统隐含的标准输入输出文件是指终端。 (5)每次最多能够同时打开的文件数目由一个 宏FOPEN_MAX决定,一般不少于8个。具体数 目需要查阅编译手册。 2. 文件的关闭 简单地说,关闭文件就是撤销与操作文件相关的流。 即通过关闭操作,通知系统释放相应的文件信息区(结构 体变量)。这样,原来的指针变量不再指向该文件,此后 也就不可能通过此指针来访问该文件。如果是执行写操 作后用fclose关闭文件,则系统会先输出文件缓冲区的 内容(不论缓冲区是否已满)给文件,然后再关闭文件。 这样可以防止丢失本来应写到文件上的数据。 如果不关闭文件而直接使程序停止运行,这时就会丢 失缓冲区中还未写入文件的信息。因此必须注意:文件 用完后必须关闭。fclose (文件指针变量); C语言中,关闭缓冲文件使用fclose函数,它的格式 为: fclose (文件指针变量); 8.3.7 文件的字符读写 1. 写一个字符到磁盘文件 int fputc(int ch, FILE *fp); 参数:ch要写到文件的字符;fpFILE 类型的数据文件指针变量(简称为指向该文件的 指针)。 功能:把字符变量的值输出到指针变量fp所指 向的文件。 返回:该函数执行成功,返回写出的字符;失 败,返回EOF。 #include #include int main(void) FILE *fp; int ch; if (fp=fopen(“f:C3exfile1.txt”,”w”)=NULL) printf(“cannot open this file.n”); exit(1); while (ch=getchar()!=n) fputc(ch,fp); fclose(fp); return 0; 运行情况如下,当键入: love China. 时,这些字符将逐个被输出到磁盘文件file1.txt中。 2. 从磁盘文件中读一个字符 fgetc函数能从磁盘文件接收一个字符,其原型为: int fgetc(FILE *fp); #include #include int main(void) FILE *fp; char ch; if ( fp=fopen(“f:C3exfile1.txt”,”r”)=NULL) printf(“cannot open this file.n”); exit(1); while ( ch=fgetc(fp)!=EOF) /* 将用fgetc()读入的字符逐 个显示 */ putchar(ch); fclose(fp); return 0; 程序运行显示如下结果: I love China. 8.3.8 文件的字符串读写 (1)fputs函数可以向文件写入一个字符串,其原型为: int fputs (const str, FILE *fp); 参数:str字符数组或字符串。 功能:把字符数组str中的所有字符(或字符指针指向的串,或字符串 常量)输出到fp所指向的文件,但字符串结束符“0”不输出。 返回:成功,返回非负值;失败,返回EOF。 (2)函数fgets()可以从文件读取一个字符串,其原型为: char * fgets (char *str, int n, FILE *fp); 参数: str用于存放读入的字符串。 n送入到str中的字符个数。包括从文件中读取的n-1个字符和自动 添加的“0”。 功能:从fp指向的文件读取n-1个字符,放到字符数组str中。如果在读 入n-1个字符完成之前遇到换行符“n”或文件结束符EOF,即结束读入 。但将遇到的换行符“n”也作为一个字符送入str数组。在读入的字符串 之后自动加一个“0”。 返回:成功,str数组首地址;如读到文件尾或出错则返回NULL。 #include #include #include int main(void) FILE *fp; char string81; if (fp=fopen(“f:C3exefile2.txt”,”w”)=NULL) printf(“cant open file”); exit(1); while (strlen (gets(string)0) fputs(string, fp); fputs(”n“,fp); fclose(fp); return 0; 8.3.9 文件的格式化读/写 文件的格式化输出 文件的格式化输出使用fpintf()函数,其原型为: int fprintf(FILE *stream, char *format, argument,.); 参数: stream-文件指针。 format、argument:格式字符串和输出参数列表与printf函数的含义是相同的。 功能:传送格式化输出到一个stream所指向的流中。 返回:成功,实际输出的字符数。 #include #include #include int main(void) FILE * fp; char name20; int num; float score; if (fp=fopen(“f:C3exefile3.txt”,”w”)=NULL) printf(“cant open file”); exit(1); printf(“type name,num,score:”); scanf(“%s %d %f”,name, while (strlen (name)1) fprintf(fp,“%s %d %f”,name, num, score); printf(“type name, num, score:”); scanf(“%s %d %f”,name, fclose (fp); return 0; 文件的格式化输入 文件的格式化输入使用fscanf()函数,其原型为: int fscanf(FILE *stream, char *format,argument.); 参数: stream-文件指针。 format、argument:格式字符串和输入参数列表与scanf函数 的含义是相同的。 功能:从一个流中执行格式化输入。 返回:成功,实际输入的数据个数。 #include #include int main() FILE *fp; char name20; int num; float score; if (fp=fopen(“f:c3exefile3.txt”,”r”)=NULL) printf(“cant open file”); exit(1); while (fscanf(fp, “%s %d %f”,name, fclose (fp); return 0; 8.4.1 文件位置指针的定位 1. fseek函数 fseek()函数的作用是使位置指针移动到 所需的位置。fseek函数的原型为: int fseek (FILE *fp, long int offst, int orgn) ; 8.4 8.4 扩展知识与理论扩展知识与理论 2. ftell函数 ftell函数能告知用户位置指针的当前指 向。 例如ftell(fp)的值是fp所指向的文件中位 置指针的当前指向。如果出错(例如不存 在此文件),则ftell函数返回值为-1。其原 型为: long int ftell(FILE *fp); 3. rewind函数 rewind函数的作用是使位置指针重新返 回到文件的开头处。此函数无返回值。其 原型为: void rewind(FILE *fp); 8.4.2 文件随机读写程序的应用 #include #

温馨提示

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

评论

0/150

提交评论