1、第10章 文件作业点评 请简述一下结构体和共用体的异同。 请分析一下结构体数组与链表的区别。预习检查 什么是文件 怎么打开和关闭文件3文件概述重点了解掌握2文件的随机读写文件的打开与关闭文件的读写1学习目标【案例1】-案例描述 新学年伊始,许多大一新生来校报道,为了方便对学生信息的统一管理,校方需要将学生的相关信息制作成学生信息表,存储到磁盘中。学生信息表中包含学号、姓名、年龄、性别四项信息,编程实现学生信息表的文本形式存储和二进制形式存储,并将生成的文件存储到D盘的Stu文件夹中。【案例1】-案例分析 本案例中学生信息的存储不借助既定的表格(如excel),而是将学生信息直接存储到文本文件或
2、二进制文件中。在进行存储之前,应先有文件,因为要存储到两种形式的文件中,所以分别创建两个文件。在存储学生信息时,可以以每位学生的每一项信息为单位进行存储,也可以构造学生信息结构体,以每位学生的所有信息为单位进行存储。 在实现学生信息存储之前,需要先了解一下计算机中文件及文件存储的相关知识,以及针对计算机文件的相关操作,下面将针对所需知识逐一讲解。【案例1】-必备知识1计算机中的流文件23文件的缓冲区文件指针45文件的打开与关闭写文件6 计算机计算机中的流中的流 在C语言中将通过不同输入/输出设备(键盘、内存、显示器、网络等)之间的数据传输抽象表述为“流流”。源 输 入 流程序 输出流程序目标【
3、案例1】-必备知识什么是文件?什么是文件?【案例1】-必备知识【案例1】-必备知识 文件文件所谓“文件”一般指存储在外部介质上数据的集合。操作系统是以文件为单位对数据进行管理的,也就是说,如果想找存放在外部介质上的数据,必须先按文件名找到指定的文件,然后从文件中读取数据。 一个文件要有唯一的文件标识,以便用户识别和引用。文件标识包括3部分,分别为文件路径文件路径、文件名主干文件名主干和文件后缀文件后缀。 文件文件【案例1】-必备知识 根据数据的组织形式,数据文件可分为文本文件和二进制文件。 文件文件【案例1】-必备知识1、二进制文件、二进制文件数据在内存中是以二进制形式存储的,如果不加转换地输
4、出到外存,就是二进制文件。 2、文本文件、文本文件文本文件又称为ASCII文件,每一个字节放一个字符的ASCII码。 文件文件的缓冲区的缓冲区 ANSI C标准采用“缓冲文件系统”处理文件。缓冲文件系统的特点是在内存开辟一个“缓冲区”,为程序的每一个文件使用。 当程序执行读文件操作时,先将一批文件内容读到缓冲区中,然后再将内容从缓冲区逐个读到程序中。当程序执行写文件操作时,先将数据写入到缓冲区中,待缓冲区装满后再将数据从缓冲区一起写入到磁盘文件中。【案例1】-必备知识 文件文件指针指针 在C语言中,对文件的所有操作都必须依靠文件指针来完成。文件指针的定义格式如下所示: FILE * 变量名;
5、例 FILE * fp;【案例1】-必备知识一个文件指针变量只能指向一个文件。 文件的打开与关闭文件的打开与关闭操作文件之前首先要打开文件,不打开文件就不能对其进行读写。C语言提供了fopen()函数,该函数用于打开文件,其返回值类型为文件指针。fopen()函数的函数声明如下:FILE * fopen(char* filename, char* mode);【案例1】-必备知识打开文件并对文件操作结束后要关闭文件。关闭是释放缓冲区和其他资源的过程,不关闭文件就会慢慢耗光系统资源。C语言提供了一个fclose()函数,该函数用于关闭文件,其返回值类型为int类型。fclose()函数的函数声明
6、如下: int fclose(FILE * fp);【案例1】-必备知识 文件的打开与关闭文件的打开与关闭用fopen()函数打开文件,需要确定文件的打开模式。文件常用的打开模式如下表所示。【案例1】-必备知识 文件的打开与关闭文件的打开与关闭打开模式打开模式名称名称描述描述r/rb只读模式以只读的形式打开一个文本文件/二进制文件,如果文件不存在或无法找到,fopen()函数调用失败,返回NULLw/wb只写模式以只写的形式创建一个文本文件/二进制文件,如果文件已存在,重写文件a/ab追加模式以只写的形式打开一个文本文件/二进制文件,只允许在该文件末尾追加数据,如果文件不存在,则创建新文件r+
7、/rb+读取/更新模式以读/写的形式打开一个文本文件/二进制文件,如果文件不存在,fopen()函数调用失败,返回NULL w+/wb+写入/更新模式以读/写的形式创建一个文本文件/二进制文件,如果文件已存在,则重写文件a+ab+追加/更新模式打开一个文本/二进制文件,允许进行读取操作,但只允许在文件末尾添加数据,若文件不存在,则创建新文件(1)、写文本文件、写文本文件fputc()函数用于向文件中写入一个字符,其语法格式如下: 写文件写文件int fputc(char ch, FILE * fp);【案例1】-必备知识ch表示写入的内容,fp表示一个文件指针,int表示函数返回值的类型为整数
8、类型。 写文件写文件(1)、写文本文件、写文本文件fputs()函数将字符串写入文件,其函数声明如下:int fputs(const char * str, FILE * file);【案例1】-必备知识参数str表示指向待写入的字符串的字符指针;参数file表示文件指针,该指针指向需要写入字符串的文件;返回值类型int类型表示函数返回值的类型为整型。 写文件写文件(2)、写二进制文件、写二进制文件fwrite()函数用于以二进制的形式将数据写入文件,其函数声明如下:unsigned int fwrite(const void * str, unsigned int size,unsigned
9、 int count, FILE * file);【案例1】-必备知识参数str为指向待写入数据的指针;size为待写入数据的字节数;count为待写入size个字节的数据的个数;file为文件指针,该指针指向需要写入字符的文件;返回值类型unsigned int型表示函数返回值的类型为无符号整型。 写写文件文件(2)、写二进制文件、写二进制文件fprintf()函数用于格式化输出数据到文件,其函数声明如下:int fprintf(FILE * file, const char * format, .);【案例1】-必备知识参数file表示文件指针,该指针指向需要写入字符串的文件;参数form
10、at表示以什么样的字符串格式输出到文件中;返回值类型int型表示函数返回值的类型为整型。【案例1】-案例实现案例案例代码(详见教材代码实现)代码(详见教材代码实现)案例设计123打开一个文本文件;45调用fputs()函数、fputc()函数和fwrite()函数写入数据;调用fclose()函数关闭文件;打开一个二进制文件;调用fputs()函数、fputc()函数和fprintf()函数向其中写入数据;6调用fclose()函数关闭文件;【案例2】-案例描述 信息的存储是为了方便对信息的重复使用。一般对信息的操作包含增加、删除、修改和查询这四项,这四项操作都基于已存在的文件。本案例的目标是
11、实现学生信息的读取,要求从案例1生成的文件中,读取学生信息,输出到屏幕上。【案例2】-案例分析 本案例的实现基于案例1中已存在的文件,通过案例1的学习可知,在对文件进行操作之前需要先打开文件,之后才能逐一读取文件中的内容。案例1中生成了两个文件,一个为文本文件,一个为二进制文件,因为其存放形式不同,所以在打开时需要使用不同的打开模式。【案例2】-必备知识1读文件文件位置指针2(1)、读文本文件)、读文本文件fgetc()函数用于读取文件的字符,其语法格式如下: 读文件读文件char fgetc(FILE * fp);【案例2】-必备知识参数fp表示一个文件指针变量,char表示函数返回值的类型
12、为字符类型。 读文件读文件(1)、读文本文件)、读文本文件fgets()函数用于从文件中读取一行字符串,或读取指定长度的字符串,其函数声明如下:char * fgets(char * buf, int maxCount, FILE * file);【案例2】-必备知识参数buf指向用来存储文件数据的数组的地址;参数maxCount指明存储数据的大小;参数file是将要读取的文件的文件指针。返回值类型char *型表示函数返回值的类型是字符型指针。 读文件读文件(2)、读二进制文件、读二进制文件fread()函数用于在程序中以二进制的形式来读取文件,其函数声明如下:unsigned int fr
13、ead(void * dstBuf, unsigned int elementSize,unsigned int count, FILE * file);【案例2】-必备知识参数dstBuf表示指向要接收数据的内存空间的指针;参数elementSize表示接收的数据项的字节数;参数count表示每次函数运行时要读取的数据项的个数,每个数据项是elementSize个字节;参数file表示文件指针,该指针指向需要写入字符的文件;返回值类型unsigned int型表示函数返回值的类型为无符号整型。(2)、读二进制文件、读二进制文件fscanf()函数用于从文件中格式化读取数据,其函数声明如下:i
14、nt fscanf(FILE * file, const char * format, .); 读文件读文件【案例2】-必备知识参数file表示文件指针,该指针指向需要读取字符串的文件;参数format表示文件中的字符串以什么样的格式输入到程序中;返回值类型int型表示函数返回值的类型为整型。1、rewind()函数函数rewind()函数的作用是将文件位置指针指向文件开头,该函数的定义的语法格式如下所示: 文件文件位置位置指针指针void rewind(FILE * fp);【案例2】-必备知识2、fseek()函数函数fseek()函数的作用是将文件位置指针指向指定位置,该函数定义的语法格
15、式如下所示: 文件文件位置位置指针指针int fseek(FILE * fp, long offset, int origin);【案例2】-必备知识参数origin的值有三个,具体如下: SEEK_SET:对应的数字值为0,表示从文件开头进行偏移; SEEK_CUR:对应的数字值为1,相对于当前位置进行偏移; SEEK_END:对应的数字值为2,相对于文件末尾进行偏移。3、ftell()函数函数ftell()函数的作用是获取文件位置指针的当前位置,该函数定义的语法格式如下所示: 文件文件位置位置指针指针long ftell(FILE * fp);【案例2】-必备知识ftell()函数调用成功
16、后,返回文件位置指针的当前位置,但如果当文件不存在或发生其他错误时,则函数的返回值为-1L。【案例2】-案例实现案例案例代码(详见教材代码实现)代码(详见教材代码实现)案例设计 读取文件之前应保证文件已经存在,本案例设计读取案例1中生成的文件。文件读取时同样需要打开和关闭,本案例中将使用不同的打开模式打开文本文件和二进制文件,之后分别使用fgetc()和fscanf()函数获取文本文件中的内容,使用fread()函数读取二进制文件中的内容。【案例3】-案例描述 编程实现学生成绩的存储和删除,具体要求如下: (1)根据输入的路径和文件名创建或打开文件,通过输入设备输入多条学生信息,将输入的学生信
17、息保存到磁盘文件中; (2)根据用户输入的学生姓名,删除成绩表中对应的记录。【案例3】-案例分析 存储一条信息的方法在案例1中已经实现,本案例中需要实现的是存储多条信息到文件中,与案例1的不同在于在打开和关闭文件之间将会进行多次写操作。 删除信息的基本方法是:将文件中的数据读到辅助变量中,检测辅助变量中是否包含要删除的信息,如果有,则删除此条信息,然后以重写的方式打开文件,使用辅助变量中的数据覆盖原文件中的数据。 经过以上分析可知,删除学生信息的主要步骤依然是文件信息的读写。文件信息的读写方式在案例1和案例2中已经学习,本案例不再赘述。【案例3】-案例实现案例设计 信息的写入和存储123构造学
18、生结构体,结构体中包含学生姓名和成绩;使用追加方式打开一个二进制文件,将结构体数组中的数据逐条写入文件中;定义一个学生结构体变量数组,保存写入的每一条学生信息;【案例3】-案例实现案例设计 信息的写入和存储123由用户输入一个学生姓名;45以重写的方式打开文件,将数组中的信息写入文件,之后关闭文件。检测数组中是否包含要删除的信息,作相应处理;查找学生信息;打开文件,将文件中信息存储到结构体数组中,关闭文件;案例案例代码(详见教材代码实现)代码(详见教材代码实现)【案例4】-案例描述 近些年来,因为信息泄露造成财产损失的事件时有发生。随着科技的发展,信息的传播与获取越来越方便,为了防止因信息泄露
19、造成的各种危机,信息加密技术应得到充分的重视。本案例要求设计程序,对已经存在的文件进行加密和解密。【案例4】-案例分析 文件加密的目的是保证信息的安全,加密的原理是根据某种原则,对源文件中的信息进行修改,使加密后的文件在与源文件仍保持联系的情况下,不会直接反映出源文件中存储的信息,并且加密后的文件能根据某种原则,还原出源文件的内容。【案例4】-案例实现案例设计 根据案例分析,本案例中的文件可分为三个:源文件,加密文件和解密后的文件。 使用异或的方式对源文件进行加密。为了保证源文件的完整,这里将加密后的信息存放到新的文件中,所以将运算的结果存储到加密文件。 若要根据加密文件获取源文件中存储的信息
20、,需要逐个读取加密文件中的字符,使其与密码再次异或,获取解密后的信息。案例案例代码(详见教材代码实现)代码(详见教材代码实现)【案例5】-案例描述 随着科技的发展,计算机的普及,计算机软件在诸多领域都得到了广泛的应用。如今,管理系统不再是大公司的专利,许多小型的管理系统,如餐厅的餐饮管理系统、超市的收银系统、学校的学生选课系统等都已逐步普及到了我们的生活中。 本案例要求实现一个基于单链表的图书管理系统,该系统可实现图书信息的增加、浏览、查询、更新、删除这五项功能,并能将链表中存储的数据保存到文件中。【案例5】-案例分析 本案例要求实现基于单链表的图书管理系统,并能实现增删改查这几项基本功能。第
21、9章的案例6对单链表的定义与基础操作进行了详细地讲解,掌握单链表的基础操作是完成本案例的前提。另外图书信息应包含多项数据,所以链表结点中应为结构体类型的数据。当需要将链表中的数据保存到本地时,可以使用文件读写将数据写入创建的文件中。【案例5】-案例实现案例设计 功能函数设计如下:123图书信息录入。该函数应实现增加数据的功能,其实质为链表结点的添加;45图书信息删除。该函数借助查询功能,查找链表中的数据,并删除;图书信息查询。该函数应能根据用户输入的某项信息,查找记录并输出;图书信息修改。该函数应能根据用户输入的某项信息,修改信息并保存;图书信息浏览。该函数应实现链表中书籍信息的输出,其实质为
22、链表的遍历;【案例5】-案例实现案例设计 功能函数设计如下:678图书信息保存。该函数应能将链表中的数据写入文件;菜单函数。本函数可展示功能菜单,提供用户与程序交互的入口;创建书单;案例案例代码(详见教材代码实现)代码(详见教材代码实现)本章本章主要讲解主要讲解C语言中语言中文件的相关概念文件的相关概念,包括计算机,包括计算机中的流、文件的定义、文件的缓冲区、文件指针、中的流、文件的定义、文件的缓冲区、文件指针、文件的位置指针等,同时也讲解了文件的相关操作,文件的位置指针等,同时也讲解了文件的相关操作,如文件的打开与关闭、文件的读写、文件中信息的如文件的打开与关闭、文件的读写、文件中信息的删除等。通过本章的学习,读者应掌握删除等。通过本章的学习,读者应掌握C语言中文件语言中文件的基本知识与初级操作方式,并能够使用的基本知识与初级操作方式,并能够使用C语言代码语言代码操作文件。操作文件。 本章小结