第11章 文件管理《C语言程序设计案例式教程(第2版)》学习目标/Target学习目标/Target章节概述/ Summary对于一台计算 机而言,最基本的功能就是存储数据。一般情况下,数据在电脑上都是以文件的形式存放的。在程序中也经常需要对文件进行操作,例如打开一个文 件,向文件写入内容,关闭一个文件等。本章将针对C语言中的文件操作进行详细地讲解。目录/Contents目录/Contents打开电 子书籍案例11-1【案例11-1】打开电子书籍(1)了解计算机中文件相关概念,能够说出流的概念、文件的概念、文件的分类、文件指针的 概念(2)掌握文件的打开与关闭,能够调用fopen()函数与fclose()函数打开与关闭文件学习目标案例描述假如现在有一篇电子版 的《史记》摘录笔记保存在计算机D盘,文件名称为:《史记》摘录笔记.txt,如果要阅读这篇摘录笔记,需要先打开文件。请编写一个程序, 打开《史记》摘录笔记。知识需求 打开 阅读 修改学习文件相关知识文件操作知识讲解1.计算机中的流流:通过不同输入/输出设备(键盘、 内存、显示器、网络等)之间的数据传输。流的本质:字节序列。输入程序的字节序列被称为输入流,从程序输出的字节序列被称为输出流。知识讲 解1.计算机中的流输入输出流可进一步细分为文本流和二进制流。输入输出流输入输出的数据是一系列的字符,可以修改。输入输出的数据是一系 列的字节,不可以修改。知识讲解1.计算机中的流stdinstdoutstderr预定义流标准输入流,对应于键盘上的输入。标准输出流 ,对应于控制台上正常输出。标准错误输出流,对应于控制台上错误输出。知识讲解2.文件的概念文件:一般指存储在外部介质上数据的集合。一 个文件要有唯一的文件标识,以便用户识别和引用。文件标识包括3部分:文件路径、文件名主干和文件后缀。知识讲解3.文件分类根据数据的组 织形式,数据文件可分为文本文件和二进制文件。二进制文件数据在内存中是以二进制形式存储的,如果不加转换地输出到外存,就是二进制文件。 可以认为二进制文件就是存储在内存的数据的映像,所以也称为映像文件。文本文件文本文件又称为ASCII文件,每一个字节放一个字符的AS CII码。知识讲解3.文件分类有整数100000,分别以二进制形式和文本形式存储到文件。二进制形式,仅需4个字节,但内容不够直观文 本形式,内容直观,但需要6个字节,且转换需要花费时间知识讲解4.文件指针文件的所有操作都必须依靠文件指针完成。要想对文件进行读写操 作,首先必须将文件与文件指针建立联系,然后通过文件指针操作相应的文件。FILE 变量名;FILE是系统声明的定义文件指针的结构体 ,用于保存文件相关信息,如文件名、文件位置、文件大小、文件状态等。知识讲解4.文件指针文件指针定义示例。FILE fp;定义文 件指针fp之后,系统根据FILE结构体分配一段内存空间作为文件信息区,用于存储要读写文件的相应信息。将文件指针与文件关联(调用fo pen()函数)。fp=fopen("a.txt");知识讲解4.文件指针上述代码中,fopen()函数将文件指针fp与a.txt 文件关联起来,a.txt文件的相关信息就会存储到指针fp指向的内存空间。知识讲解4.文件指针一个文件指针只能关联一个文件,关联多个 文件需要定义多个文件指针。知识讲解5.文件的打开与关闭文件的打开与关闭可以调用fopen()函数与fclose()函数。FILE fopen(const char filename,const char mode);文件的绝对路径,包含路径名和文件的扩展 名文件打开模式知识讲解5.文件的打开与关闭fopen()函数打开文件的模式。知识讲解5.文件的打开与关闭fopen()函数打开文件 示例。FILE fp;fp = fopen("D:\\test.txt", "r");if(fp == NULL) //如果 文件打开失败,如不存在test.txt文件,返回值是NULL{ printf("打开失败!\n"); exit(0); // 退 出程序}知识讲解5.文件的打开与关闭文件的打开与关闭可以调用fopen()函数与fclose()函数。int fclose(FIL E fp);文件关闭成功返回0,否则返回EOF。案例实现定义文件指针,调用fopen()函数打开D盘下的《史记》摘录笔记.txt 文件。如果打开失败,输出打开失败提示信息,如无法打开文件,然后退出程序。如果打开成功,输出打开成功提示信息,如开卷有益,祝您阅读愉 快。010203调用fclose()函数关闭文件。04案例实现2.完整代码本案例中可以实现的效果图如下。代码实现输出文件内容案例1 1-2【案例11-2】输出(1)了解文件位置指针的概念,能够说出文件位置指针的作用(2)掌握文件的单字符读写,能够调用fgetc( )与fputc()函数实现文件的单字符读写(3)掌握文件的单行读写,能够调用fgets()与fputs()函数实现文件的单行读写学 习目标案例描述语文老师李老师下节课要讲授孟子三则中的《生于忧患,死于安乐》,为了达到更好的教学效果,李老师提前备课,并将课文难点作 了注释,整理成了“天将降大任.txt”笔记,提前发给学生进行预习。学生收到文件后,需要打开预习,请编写一个程序,帮助学生打开李老师 的笔记文件,将内容输出显示。知识需求输出文件内容文件位置指针定位单字符输出单行输出知识讲解1.文件位置指针文件位置指针用于标识当前 文件的读写位置,它是真正指向文件内容的指针。每读写一个单位数据,文件位置指针就按顺序向后移动一个位置。读写文件移动文件位置指针文件 读取完毕后,文件位置指针指向文件末尾,这个位置用EOF标识。知识讲解2.单字符读写文件C语言中提供了fgetc()和fputc() 函数,这两个函数是针对字符进行读写操作的。fgetc()函数01fgetc()函数用于读取文件中的字符。char fgetc(FI LE fp);知识讲解2.单字符读写文件fgetc()函数用法示例。FILE fp;char ch;fp = fopen("h ello.txt", "r");ch = fgetc(fp); // 从文件中读取每个字符while (ch != EOF) // 只要文件没读到结尾,就执行下面的代码{ printf("%c", ch); ch = fgetc(fp);}知识讲解2.单字 符读写文件C语言中提供了fgetc()和fputc()函数,这两个函数是针对字符进行读写操作的。fputc()函数02fputc( )函数用于向文件写入一个字符。int fputc(char ch, FILE fp);知识讲解2.单字符读写文件fputc()函 数用法示例。FILE fp;int i=0;char arr[]="I Like C Program";fp = fopen(" hello.txt", "w"); // 只写的方式,若文件不存在则创建文件while (arr[i] != ''\0'') // 遍历字符数组中的每一个字符{ fputc(arr[i], fp); // 将字符写入文件中 i++; // 将字符数组的下标后移 一位}知识讲解2.单行读写文件文件内容较多时,单字符读写文件效率太低,为了提高效率,C语言提供了单行读写文件的函数。01fgets ()函数fgets()函数用于从文件中读取一行字符串,或读取指定长度的字符串。char fgets(char buf, i nt maxCount, FILE file);存储文件数据的数组的地址读取数据的大小,最多读取maxCount-1个字符要读 取的文件知识讲解2.单行读写文件文件内容较多时,单字符读写文件效率太低,为了提高效率,C语言提供了单行读写文件的函数。01fget s()函数如果fgets()函数读取的字符不足maxCount-1个,则读完该行就结束。如果该行(包括最后一个换行符)的字符数超过 maxCount-1,则fgets只返回一个不完整的行,但是对fgets()函数的下一次调用会继续读该行。知识讲解2.单行读写文件 fgets()函数用法示例。FILE fp; // 声明文件指针char str[100]; // 文件数据缓冲区fp = fopen("hello.txt", "r"); // 打开文件,并将文件和文件指针关联while (!feof(fp)) // 判断文件指针是否已指向文件的末尾{ memset(str, 0, sizeof(str)); // 初始化文件数据缓冲区 f gets(str, sizeof(str), fp); // 按行读取数据 printf("%s", str); // 打印文 件数据缓冲区中的字符串}知识讲解2.单行读写文件文件内容较多时,单字符读写文件效率太低,为了提高效率,C语言提供了单行读写文件的函 数。02fputs()函数fputs()函数可以将字符串写入文件。int fputs(const char str, FILE file);知识讲解2.单行读写文件fputs()函数用法示例。FILE fp; // 声明文件指针char str [3]; // 定义字符指针数组int i;str[0] = "I Like C Program\n"; // 字符指针指向字符 串常量的首地址str[1] = "It Is Amazing\n";str[2] = "It Is Interesting\n"; fp = fopen("hello.txt", "w"); // 打开文件,若文件不存在则创建文件for (i = 0; i < 3; i++) fputs(str[i], fp); // 将字符数组str中的整个字符串写入文件中案例实现12假设文件存储在D盘 ,定义文件指针fp,调用fopen()函数打开D盘下的文件天将降大任.txt。调用fgets()函数逐行读取文件内容,并输出到控制 台。案例实现2.完整代码本案例中可以实现的效果图如下。代码实现班级通讯录案例11-3【案例11-3】班级通讯录巩固前面所学知识,能 够利用前面所学知识实现案例11-3。学习目标案例描述随着新学期的到来,新生陆续开始到学校报道,为了方便辅导员老师管理班级,辅导员老 师通常都会建一个通讯录存储每位学生的联系方式。本案例要求编写一个程序,帮助辅导员老师建立一个班级通讯录,收集学生信息(姓名、联系方 式)存储到文件中。案例实现123456调用fopen()函数以读写方式打开通讯录文件telList.txt。定义字符数组name和 tel分别用于存储学生姓名和手机号码。假设班级有5名学生,使用for循环从键盘输入学生信息存储到对应数组。调用fputs()函数将 数组中的数据写入文件telList.txt。关闭文件telList.txt。再次调用fopen()函数以只读方式打开telList .txt文件。调用fgets()函数读取telList.txt文件内容输出到控制台。案例实现2.完整代码本案例中可以实现的效果图如 下。代码实现档案存储案例11-4【案例11-4】档案存储掌握文件的二进制读写,能够调用fread()与fwrite()函数实现文件 的二进制方式读写学习目标案例描述假如你是一个个人信息档案管理员,请编写一个程序完成档案信息的录入,将档案信息保存到本地文件中,具体 要求如下所示。(1)档案信息包括姓名、性别、年龄、地址、电话。(2)从键盘输入个人档案信息,然后将其保存到本地文件。知识需求结构体 存储学生信息结构体信息写入文件数据块的读写fread()函数与fwrite()函数知识讲解1.fread()函数fread()函数 用于以二进制形式读取文件。size_t fread(void ptr, size_t size,size_t nmemb, F ILE stream);存储读取的文件数据读取元素的单位大小读取元素个数读取成功则返回读取数据的大小。读取错误返回0知识讲解2 .fwrite()函数fread()函数以二进制形式将数据写入文件。size_t fwrite(const void ptr, size_t size, size_t nmemb, FILE stream);待写入文件的数据写入数据的单位大小写入数据的 单位个数案例实现01030402定义结构体struct Record用于存储个人信息。定义结构体数组,在for循环语句中调用sca nf()从键盘输入档案信息。每输入一份档案信息,就调用fwrite()函数将数据写入本地文件。写入完毕之后,重新打开文件,调用fr ead()函数读取文件,验证信息输入是否正确无误。案例实现2.完整代码本案例中可以实现的效果图如下。代码实现数学判卷案例11-5【 案例11-5】数学判卷掌握文件的格式化读写,能够调用fscanf()与fprintf()函数实现文件的格式化读写学习目标案例描述假 如某小学一个班级的数学老师在教学一段时间后,要考核一下学生的学习效果,就出了10道100以内的加法题,每题10分,通过考试结果判断 学生的学习情况。请编写一个程序,帮助数学老师自动出题、核对答案并统计得分。知识需求学生作答试卷正确答案文件读取两个文件结果进行比对 试卷型文件,读取要按格式fscanf()函数fprintf()函数知识讲解1.fscanf()函数fscanf()函数用于从文件中 格式化读取数据。int fscanf(FILE stream, const char format, ...);以什么格式 读取文件中数据fscanf()函数用法示例。char str1[10], str2[10];FILE fp;fp = fopen ("hello.txt", "r");fscanf(fp, "%s %s", str1, str2);fclose(fp);pri ntf("%s\n", str1);printf("%s\n", str2);fscanf()函数知识讲解1.fprintf()函 数fprintf()函数将数据格式化写入文件。int fprintf(FILE stream, const char fo rmat,...);fprintf()函数用法示例。FILE fp;fp = fopen("hello.txt", "w"); // 将格式化的字符串输出到文件中fprintf(fp, "I am a %s, I am %d years old.", "st udent", 18);fclose(fp); // 关闭文件,释放资源案例实现将学生作答结果写入文件resul.txt文件。 将正确答案写入answer.txt。 分别读取result.txt文件和answer.txt文件中的答案,答案相同,学生+10分 ,否则加0分。案例实现2.完整代码本案例中可以实现的效果图如下。代码实现图书管理系统案例11-6【案例11-6】图书管理系统巩固前 面所学知识,能够利用前面所学知识实现案例11-6。学习目标案例描述本案例要求编写程序实现一个简单的图书管理系统,该系统可实现图书信 息的录入、浏览、查询、修改、删除和保存。案例实现图书信息录入。该函数应实现增加数据的功能,其实质为链表结点的添加。本案例的每个功能 将被模块化为一个函数,在主函数中根据用户的选择,调用对应的功能。图书信息浏览。该函数应实现链表中书籍信息的输出,其实质为链表的遍历 。图书信息查询。该函数应能根据用户输入的某项信息,查找判断链表中是否存在相应记录,并将查找结果输出。图书信息修改。该函数应能根据用 户输入的某项信息,找到对应记录,并修改记录中保存的信息。案例实现图书信息删除。该函数借助查询功能,查找链表中的数据,并将找到的数据 对应的结点从链表中删除。本案例的每个功能将被模块化为一个函数,在主函数中根据用户的选择,调用对应的功能。图书信息保存。该函数应能将 链表中的数据写入文件。创建书单。上述(1)~(6)这6个功能都依赖于链表,本案例设计使用链表来存储图书信息,在执行各项功能之前应先 实现一个链表。菜单函数。本函数可展示功能菜单,提供用户与程序交互的入口。案例实现2.完整代码本案例中可以实现的效果图如下。主界面案例实现2.完整代码本案例中可以实现的效果图如下。录入图书信息案例实现2.完整代码本案例中可以实现的效果图如下。图书信息浏览案例实现2.完整代码本案例中可以实现的效果图如下。图书信息查询案例实现2.完整代码本案例中可以实现的效果图如下。图书信息修改案例实现2.完整代码本案例中可以实现的效果图如下。图书信息删除图书信息保存案例实现2.完整代码本案例中可以实现的效果图如下。图书信息保存文件案例实现2.完整代码本章小结本章主要讲解了文件的相关知识。1. 讲解了文件的基本概念,包括计算机中的流、文件的概念、文件的分类、文件指针与文件位置指针。2. 讲解了文件的打开与关闭。3. 讲解了文件的读写,包括单字符读写文件、单行读写文件、二进制读写文件、格式化读写文件。通过本章的学习,读者应掌握C语言中文件的基本知识与初级操作方式,并能够使用C语言代码操作文件。本章小结 |
|