语言基础程序 5_第1页
语言基础程序 5_第2页
语言基础程序 5_第3页
语言基础程序 5_第4页
语言基础程序 5_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

《C语言程序设计》教案PAGE1课题名称项目9文件管理系统任务9实现库存数据文件管理计划课时4课时授课老师地点学情分析本项目基于C语言文件处理章节的核心知识,开发一个完整的文件管理系统。系统采用二进制文件存储方式,效率高且占用空间小。实现商品数据的持久化管理和高效访问。项目将综合运用文件打开关闭(fopen/fclose)、数据块读写(fread/fwrite)、文件定位(fseek/rewind)等关键技术,重点解决结构体数据序列化、随机访问效率和异常处理等核心问题。教学目标知识目标熟悉常用的文件打开模式及其区别。掌握基本的文件读写函数。能力目标理解文件的概念及其分类(文本文件和二进制件)。掌握文件指针的概念和作用。掌握文件操作的基本流程:打开、读写、关闭。素质目标具有开拓自我、坚忍不拔的毅力和吃苦耐劳的品质。在编程中注重对函数的正确编写及调用,增强程序的复用性及可读性。培养文件操作的规范意识,提升程序的健壮性。教学重点文件指针(FILE*)的声明与操作,文件打开模式(r/w/a/b)常用I/O函数(fopen/fclose、fscanf/fprintf、fread/fwrite、fgets/fputs),文件结束检测(feof/EOF),文件定位(fseek/ftell/rewind)。教学难点二进制与文本文件的区别及读写差异,feof与EOF的正确使用时机,缓冲区刷新与错误处理,文件指针的移动与位置跟踪,结构体数据的直接写入与读取。教学方法讲授法、案例演示法、任务驱动法、小组互助纠错法。先掌握文本文件操作,再进阶二进制文件;编写小程序逐步验证每个函数(如复制文件、统计字符数);善用调试工具观察文件指针变化;刻意练习错误处理(如文件打开失败);结合项目实战(如学生成绩管理系统)综合应用。教学工具计算机机房、Dev-C++软件、PPT课件、教材、程序效果图、语言分类对比表等教学过程第一课时:理论奠基+代码基础讲解(45分钟)一、课程导入(5分钟)基于C语言文件处理技术,小辰着手开发文件管理系统,通过二进制文件存储、随机访问定位、数据块快速读写等核心技术,帮家人实现商品数据的高效管理。设计一个简单的文件管理系统,实现库存数据的文件存储与读取功能。系统能够将商品信息保存到文件中,并在需要时从文件中读取数据,效果如图9-12所示。二.新知讲授(35分钟)9.1.1文件概述在程序中经常需要对文件进行操作,例如打开文件、向文件写入内容。本任务将对C语言中的各种文件操作进行详细讲解。1.文件的定义文件是指一组相关数据的有序集合。每个文件都有一个文件名,包括文件名主干和扩展名,如图9-1所示。在前文中,实际上我们已经多次使用了文件,包括源程序文件、库文件、可执行文件等。文件要有唯一的文件标识,以便用户识别和引用。文件标识包括3部分:文件路径、文件名主干、文件扩展名,如图9-2所示。文件路径表示文件在外部存储设备中的位置。文件名主干的命名遵循标识符的命名规则。文件扩展名用来表示文件的类型。2.文件的分类根据数据的组织形式,数据文件可分为ASCII文件和二进制文件。数据在内存中是以二进制形式存储的,如果不加转换地输出到外存,就是二进制文件,可以认为它就是存储在内存的数据的映像,所以也称之为映像文件(imagefile)。如果要求在外存上将数据以ASCII形式存储,则需要在存储前进行转换。ASCII文件又称文本文件(textfile),每一个字节存放一个字符的ASCII。字符一律用ASCII文件存储,数值型数据既可以用ASCII文件存储,也可以用二进制文件存储。数值型文件可以用ASCII、十进制、二进制等表示,如图9-3所示。3.文件指针C语言中,若用指针变量指向一个文件,指针就称为文件指针,一般语法格式如下。FILE*指针变量标识符其中FILE应为大写形式,它实际上是由系统定义的一种结构,该结构中含有文件名、文件状态和文件当前位置等信息。例如:FILE*fp;//定义一个指向FILE结构类型的指针变量fpfp是指向FILE结构类型的指针变量,也就是说,通过文件指针变量能够找到与它关联的文件。也可以把fp称为文件的指针。如果有n个文件,应定义n个指针变量,分别指向n个FILE结构类型的指针变量,以实现对n个文件的访问。方便起见,通常将这种指向文件信息区的指针变量称为指向文件的指针变量。9.1.2文件的打开和关闭对文件进行读写之前应该打开文件,在使用结束之后应关闭文件。打开”是指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入和输出的数据)。在编写程序的过程中,打开文件的同时,一般都指定一个指针变量指向文件,也就是建立起指针变量与文件之间的联系,这样,就可以通过该指针变量对文件进行读写了。1.文件的打开C语言中,文件的操作都是由库函数来完成的。用fopen()函数打开文件,其一般语法格式如下。文件指针名=fopen(文件名,使用方式);其中文件指针名必须被声明为FILE类型的指针变量;文件名是待打开文件的文件名称,可用字符串常量或字符串数组表示,使用方式是指文件的类型和操作要求。例如:FILE*fp;fp=fopen("file.txt","r");表9-1文件打开模式及其含义文件打开模式含义指定文件不存在“rt”(只读)为了输入数据,打开一个已存在的文本文件出错“wt”(只写)为了输出数据,打开一个文本文件建立新文件“at”(追加)向文本文件末尾添加数据出错“rb”(只读)为了输入数据,打开一个二进制文件出错“wb”(只写)为了输出数据,打开一个二进制文件建立新文件“ab”(追加)向二进制文件末尾添加数据出错“rt+”(读写)为了读和写,打开一个文本文件出错“wt+”(读写)为了读和写,建立一个新的文本文件建立新文件“at+”(读写)为了读和写,打开一个文本文件出错“rb+”(读写)为了读和写,打开一个二进制文件出错“wb+”(读写)为了读和写,建立一个新的二进制文件建立新文件“ab+”(读写)为了读和写,打开一个二进制文件出错表9-1列出了12种文件打开模式,其中有6种是在第一个字母后面加了字母b的,即rb、wb、ab、rb+、wb+、ab+,b表示二进制方式。其实,带b和不带b只有一个区别,即对换行的处理。由于在C语言中用'\n'即可实现换行,而在Windows系统中为实现换行必须要用“回车”和“换行”两个字符,即'\r'和'\n',因此,如果使用的是文本文件并且用读入模式打开,在向文件输出时,遇到换行符'\n'时,系统就把它转换为'\r'和'\n'两个字符,否则在Windows系统中查看文件时,各行连成一片,无法阅读。同样,如果使用的是文本文件且用写入模式打开,从文件读入时,遇到'\r'和'\n'两个连续的字符,就把它们转换为'\n'一个字符。如果使用的是二进制文件,在对文件进行读写时,不需要这种转换。加b表示使用的是二进制文件,系统就不进行转换。2.文件的关闭“关闭”是指撤销文件信息区和文件缓冲区,使文件指针变量不再指向文件,显然就无法进行对文件的读写了。用fclose()函数关闭文件,其一般语法格式如下。fclose(文件指针);例如:fclose(fp);第二课时:知识点讲授(20分钟)+学生实训(25分钟)一、知识点讲解(20分钟)3.文件的读写操作文件的读和写是文件的常用操作,C语言提供了多种文件读写函数。1.字符读写函数字符读写函数包括读字符函数和写字符函数。见表9-2。表9-2字符读写函数函数名调用形式功能返回值fgetcfgetc(fp)从fp指向的文件读入一个字符读成功,带回所读的字符,失败则返回文件结束标志EOF(即-1)fputcfputc(ch,fp)把字符ch写到文件指针变量fp所指向的文件中输出成功,返回值就是输出的字符;输出失败,则返回EOF(即-1)fgetc的第1个字母f代表文件(file),中间的get表示“获取”,最后一个字母c表示字符(character),fgetc的含义很清楚,从文件读取一个字符。fputc也类似。下面一一举例说明。【例9.1】在D:\STUDY\下有文件mm.txt,应用文件的读函数读取文件mm.txt内容,并显示输出。图9-4D:\STUDY\mm.txt程序编辑如下:1.#include"stdio.h"2.//#include"conio.h"3.#include"stdlib.h"4.voidmain()5.{6.

7.FILE*fp;8.charch;9.if((fp=fopen("D:\\tudy\\mm.txt","rt"))==NULL)10.{printf("\nCannotopenfile!");11.getch();12. exit(1);13.}14.ch=fgetc(fp);15.while(ch!=EOF)16.{17.putchar(ch);18.ch=fgetc(fp);19.}20.fclose(fp);21.}22.

【例9.2】在D:\STUDY\下有文件nn.txt,应用文件的写函数向文件nn.txt写入内容,并显示输出。程序编辑如下:1.#include"stdio.h"2.#include"stdlib.h"3.voidmain()4.{5.FILE*fp;6.charch;7.if((fp=fopen("D:\\study\\nn.txt","wt+"))==NULL)8.{printf("\nCannotopenfile!");9.getch();10. exit(1);11.}12.printf("inputsstring:\n");13.ch=getchar();14.while(ch!='\n')15.{16.fputc(ch,fp);17.ch=getchar();18.}19.rewind(fp);20.ch=fgetc(fp);21.while(ch!=EOF)22.{23.putchar(ch);24.ch=fgetc(fp); 25.}26.printf("\n");27.fclose(fp);28.}

运行结果:1.inputsstring:2.file3.file

验证:打开nn.txt文件,显示如下:图9-4D:\STUDY\nn.txt【温馨提示】(1)被写入的文件可以用写、读写、追加方式打开,用写或读写方式打开一个已存在的文件时,原文件内容将被替换。(2)写入字符从文件首开始。如需保留原有文件内容,希望写入的字符从文件末开始,必须以追加的方式打开文件,如果文件不存在,则创建新文件。(3)每写入一个字符,文件内部的位置指针向后移动一个字节。(4)fputc函数有一个返回值,写入成功则返回写入的字符,不成功则返回EOF。二.学生独立实操+巡回指导(25分钟)学生完成代码编写、保存、编译运行;教师巡回解决共性问题:三.成果点评+课堂总结(5分钟)抽取2-3份学生程序展示,点评排版优劣;总结核心知识点;第三课时:理论奠基+代码基础讲解(45分钟)课程导入(5分钟)知识点讲授+代码精讲(40分钟)2.字符串读写函数字符串读写函数包括读字符串函数和写字符串函数,如表9-3所示。fgets()和fputs()这两个函数的功能类似于gets()和puts()函数,只是gets()和puts()函数以终端作为读写对象,而fgets()和fputs()函数以指定的文件作为读写对象。表9-3字符串读写函数函数名调用形式功能返回值Fgetsfgets(str,n,fp)从fp指向的文件中读取一个长度为n-1的字符串,存放到字符数组str中读取成功,返回str地址;否则返回NULLFputsfputs(str,fp)把str所指向的字符串写到文件指针变量fp所指向的文件中输出成功,返回0;否则返回非零值fgets中最后一个字母s表示字符串(string)。顾名思义,fgets的含义是从文件中读取一个字符串。其中,n是要求得到的字符个数,但实际上只从fp所指向的文件中读取n-1个字符,然后在最后加一个'\0'字符,这样得到的字符串共有n个字符,把它们存放到字符数组str中。如果在读完n-1个字符之前遇到换行符"\n"或文件结束符EOF,读取即结束,但将所遇到的换行符"\n"也作为一个字符读取。若执行fgets()函数成功,则返回值为str数组首元素的地址,如果一开始就遇到文件尾或读取出错,则返回NULL。写入fp指向的文件中。fputs()函数中第一个参数可以是字符串常量、字符数组名或字符指针。字符串末尾的'\0'不输出。若输出成功,函数返回0;失败时,函数返回EOF(即-1)。【例9-3】从mm.txt文件中读取一个含5个字符的字符串,并在屏幕上输出。1.#include"stdio.h"2.#include"stdlib.h"3.voidmain()4.{5.FILE*fp;6.charstr[11];7.if((fp=fopen("D:\\study\\mm.txt","rt"))==NULL)8.{printf("\nCannotopenfile!");9.getch();10.exit(1);11.}12.fgets(str,6,fp);13.printf("%s\n",str);14.fclose(fp);15.}

运行结果如下。a12rg验证:打开mm.txt文件,其内容如图9-6所示。图9-6mm.txt的内容【例9-4】向文件bb.txt中追加一个字符串。1.#include"stdio.h"2.#include"stdlib.h"3.voidmain()4.{5.FILE*fp;6.charch,st[30];7.if((fp=fopen("D:\\study\\bb.txt","at+"))==NULL)8.{printf("\nCannotopenfile!");9.

getch();10.

exit(1);11.}12.printf("inputastring:");13.scanf("%s",st);14.//gets(st);15.fputs(st,fp);16.rewind(fp);17.ch=fgetc(fp);18.while(ch!=EOF)19.{putchar(ch);20.ch=fgetc(fp);21.}22.printf("");23.fclose(fp);24.}3.数据块读写函数C语言中主要的数据块读写函数是fread()和fwrite(),它们定义在stdio.h头文件中。fread()函数的一般形式:fread(buffer,size,count,fp);功能:从fp所指向的文件中,每次读size个字节存入数组buffer中,连续读count次,即读count×size个字节到数组buffer中。其中buffer是一个指针,表示存放输入数据的首地址,fp表示文件指针。fwrite()函数的一般形式:fwrite(buffer,size,count,fp);功能:从数组buffer中取出count×size个字节数据写入fp所指向的文件中。其中buffer是一个指针,表示输出数据的首地址,fp表示文件指针。【例9-5】从键盘输入3个学生的数据,将其写入一个文件中,再读出这3个学生的数据并将其显示在屏幕上。1.#include<stdio.h>2.#include<stdlib.h>3.typedefstruct{4.intid;5.charname[50];6.floatscore;7.}Student;8.intmain(){9.inti;10.FILE*file;11.Studentstudents[3],readStudents[3];12.//初始化学生数据13.students[0]=(Student){1,"张三",85.5};14.students[1]=(Student){2,"李四",92.0};15.students[2]=(Student){3,"王五",78.5};16.//写入数据到文件17.file=fopen("students.dat","wb");18.if(file==NULL){19.printf("无法打开文件进行写入!\n");20.return1;21.}22.size_twritten=fwrite(students,sizeof(Student),3,file);23.printf("成功写入%zu个学生记录\n",written);24.fclose(file);25.//从文件中读取数据26.file=fopen("students.dat","rb");27.if(file==NULL)28.{29.printf("无法打开文件进行读取!\n");30.return1;31.}32.size_tread=fread(readStudents,sizeof(Student),3,file);33.printf("成功读取%zu个学生记录:\n",read);34.for(i=0;i<3;i++)//显示读取的数据36.{37.printf("学生%d:ID=%d,姓名=%s,分数=%.1f\n",38.i+1,readStudents[i].id,readStudents[i].name,readStudents[i].score);39.40.fclose(file);41.return0;42.}

4.格式化读写函数fprintf()函数和fscanf()函数,用于对文件进行格式化输入和输出,从函数名可以看到,它们只是在printf和scanf的前面加了一个字母f。它们的作用与printf()函数和scanf()函数相仿,都是格式化读写,只有一点不同:fprintf()函数和fscanf()函数的读写对象不是终端而是文件。fscanf()函数的一般调用方式如下。fscanf(文件指针,格式字符串,输入表列);按照格式字符串要求,将文件指针所指向的文件中数据顺序读取输入表列中。例如:fscanf(fp,"%d%s",&i,s);fprintf()函数的一般调用方式如下。fprintf(文件指针,格式字符串,输出表列);按照格式字符串要求,将输出表列中的内容依次写入文件指针所指向的文件中。例如:fprintf(fp,"%d%c",j,ch);9.1.4文件的定位对文件进行顺序读写比较容易理解,也容易操作,但有时效率不高。随机访问不是按数据在文件中的物理位置次序进行读写,而是可以对任何位置上的数据进行读写,显然这种方法比顺序读写效率高得多。实现随机读写的关键是按要求移动位置指针,这被称为文件的定位。用于移动文件内部的位置指针的函数有两个:rewind()函数和fseek()函数。1.rewind()函数rewind()函数的一般调用方式如下。rewind(文件指针);rewind()函数的作用是使文件位置标记重新返回文件的开头,此函数没有返回值。2.fseek()函数fseek()函数的一般调用方式如下。fseek(文件指针,位移量,起始点);可用fseek函数改变文件位置标记,fseek()函数一般用于二进制文件。位移量:指以“起始点”为基点,向前移动的字节数(长整型)。起始点:用0、1或2代替,0代表“文件开始位置”,1代表“当前位置”,2代表“文件末尾位置”。例如:fseek(fp,100L,0); //将文件位置标记向前移到离文件开头100个字节处fseek(fp,50L,1); //将文件位置标记向前移到离当前位置50个字节处fseek(fp,-10L,2); //将文件位置标记从文件末尾处向后10个字节处【例9-6】已知文件file1.txt内有一些信息,要求把信息复制到另一文件file2.txt,并输出显示。1.#include<stdio.h>2.intmain()3.{charch;4.FILE*fp1,*fp2;5.fp1=fopen("D:\\study\\file1.txt","r"); //打开文件file1.txt6.f

温馨提示

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

评论

0/150

提交评论