92 文件和文件流.docx
《92 文件和文件流.docx》由会员分享,可在线阅读,更多相关《92 文件和文件流.docx(17页珍藏版)》请在冰豆网上搜索。
92文件和文件流
《9.2文件和文件流》
1.目标概述[5分钟]2
2.回顾[5分钟]2
3.课程知识点讲解2
3.1.文件的基本概念[5分钟]2
3.2.文件流类与文件流对象[3分钟]3
3.3.文件的打开与关闭[20分钟]3
3.4.文本文件的读写[20分钟]5
3.5.二进制文件的读写[15分钟]6
3.6.文件指针[15分钟]7
3.7.随机访问二进制文件[15分钟]7
3.8.任务解决[30分钟]8
4.精练[45分钟]8
5.小结[2分钟]8
6.技能提升[90分钟]10
7.考核点11
8.作业答案11
9.扩展练习11
10.学生问题汇总11
11.教学后记12
本节目标
⏹本节中将讲述如下主要内容:
✧文件的基本知识
✧文件流的基本知识
✧文件的打开与关闭
✧文本文件的读写
✧二进制文件的读写
✧随机访问二进制文件
⏹通过教学使学生掌握文件和文件流的使用。
本节重点
⏹文件和文件流的基本知识
⏹文件的打开与关闭和读写
⏹二进制文件的读写
⏹随机访问二进制文件
本节难点
⏹文件的读写
授课课时
⏹6课时
教法建议
目标概述[5分钟]
本节主要讲述文件和文件流。
提出本节的任务。
回顾[5分钟]
回顾上一节的相关内容。
课程知识点讲解
文件的基本概念[5分钟]
引入:
前面的程序设计中,都是以系统的标准设备进行输入/输出,但这种方式最大的缺点就是无法长久保存数据,实际应用中,通常需要利用磁盘等存储介质,以文件的形式来保存数据。
什么是“文件”(File)?
主题:
文件是指以一定格式存储在外部存储器(相对于CPU而言)上的数据集合。
这里的“外部存储器”可以是指硬盘、光盘、U盘等各类存储介质,因此可以根据存储介质的不同的将文件分为硬盘文件、光盘文件、U盘文件等。
这里的“一定格式”是指文件存储时的组织方式,通常可分为ASCII码文件与二进制文件两种方式。
ASCII文件又称文本(Text)文件或字符文件,因为它的每一个字节都存放一个ASCII码,代表一个字符,这类文件可以直接阅读。
二进制文件又称为内部格式文件或字节文件,因为它的每个字节存放的都是二进制的数据,是把数据按其在内存中的形式原样存放到磁盘上,常见的扩展名为“.EXE”与“.COM”文件都是典型的二进制文件。
文件流类与文件流对象[3分钟]
引入:
文件流是以外存文件作为输入输出对象的数据流,与标准输入输出流相比只是操作对象发生了变化,而操作方法则变化不大。
主题:
头文件fstream中包括3个流类:
ifstream用于支持从文件中读入数据;
ofstream用于支持向文件中写入数据;
fstream用于支持对文件进行双向的读写操作。
因此在使用文件流应在程序中包含下列语句:
#include
在了解用于支持文件读写的类后,如需进行文件操作,则应根据需要定义流对象。
与标准输入输出有预定义对象不同的是,文件操作没有预定义对象,因此需要程序员根据需要自行定义。
文件的打开与关闭[20分钟]
引入:
主题:
任何关于文件的操作都要先打开文件,再对文件进行读写,操作完毕后,要关闭文件。
●打开磁盘文件
打开(Open)文件是指在文件读写之前做必要的准备工作,就象要往抽屉里存放东西,必须先把抽屉打开一样。
打开文件的准备工作包括:
(1)将文件流对象与指定的磁盘文件关联起来,即指明要操作哪个文件
(2)指定对文件的工作方式。
如,该文件是作为输入文件还是输出文件,是ASCII码文件还是二进制的文件。
打开磁盘文件的工作可以通过两种不同的方法实现:
1.调用文件流的成员函数open
成员函数Open可以用于打开文件,其函数原型如下
voidopen(constchar*filename,intmode,intprot=filebuf:
:
openprot);
其中“filename”是文件名,注意这里的文件名可以带路径名,也可以不带。
如果不带路径名则使用当前目录作为指定文件的存放目录。
如果带路径名要注意要以“\\”来表示目录分隔符,如C盘根目录应写为“C:
\\”。
“mode”说明文件的输入输出方式,对文件操作的影响重大,下表列出了在ios类中定义了多种输入输出方式。
“prot”表示打开文件的属性,取值见表,默认为0。
方式
说明
ios:
:
in
以输入方式打开文件,只能执行读操作
ios:
:
out
以输出方式打开文件,只能执行写操作。
这是默认方式,如果要打开的文件已存在,则其清除全部原有内容
ios:
:
app
以输出方式打开文件,写入的数据添加在文件尾,每次写操作都定位在文件的最末尾
ios:
:
ate
打开一个已有的文件,立刻定位到文件末尾(但不保证每次操作都在文件末尾)
ios:
:
trunc
打开一个文件,如果文件已存在,则删除其中全部数据,如文件不存在,则建立一个空的新文件
ios:
:
binary
以二进制的方式打开文件,如果不指定此方式,默认打开方式为ASCII方式
ios:
:
in|ios:
:
out
以输入和输出方式打开文件,可同时对文件执行读写操作
ios:
:
in|ios:
:
binary
以二进制的方式打开一个输入文件
ios:
:
out|ios:
:
binary
以二进制的方式打开一个输出文件
文件属性取值表
0普通文件
1只读文件
2隐含文件
4系统文件
说明:
①对于ifstream流,mode的默认值是ios:
:
in;对于ofstream流,mode的默认值是ios:
:
out。
②每个打开的文件都有一个文件指针,该指针的初始位置由I/O方式确定,每次读写都从文件指针的当前位置开始,每读入一个字节,指针就后移一个字节。
当文件指针移到最后,就会遇到文件结束标志EOF(EndOfFile,占一个字节,其值为-1),这时流对象的成员函数eof的值为非0值,表示文件结束。
③可以用位或“|”运算符对输入输出方式进行组合。
④如果打开文件失败,则文件流对象无法和指定文件建立关联,则流状态标志中的failbit、badbit或hardbit将置为1,并且在ios类中重载运算符“!
”使其可以返回非0值,据此可以判断打开文件是否成功。
示例讲解:
示例9.2.1演示如何使用open函数打开文件,程序首先定义一个文件输出流对象,接下来使用open函数以写二进制文件的方式打开C盘下的test.dat文件。
分析与解答:
具体见P421
2.在定义文件流对象时指定参数
在文件流类中定义了带参数的构造函数,其中包含了打开磁盘文件的功能。
因此可以在定义文件流对象时指定参数,调用文件流类的构造函数来实现打开文件的功能。
则程序
ofstreamout;
out.open("C:
\\test.dat",ios:
:
out|ios:
:
binary);
可以改为
ofstreamout("C:
\\test.dat",ios:
:
out|ios:
:
binary);
第二种方式与第一种方式作用相同,但更为简捷,方便。
●关闭文件
如同在抽屉中存放完物品,会将抽屉关上一样,在对文件使用完毕后,也应关闭文件。
关闭文件可以使用成员函数close完成。
这里的“关闭”实际上执行与打开文件相反的操作,即解除文件流与磁盘文件的关联关系,并使原有的工作方式失效。
关闭文件后,就不能再通过该文件流对该文件执行读写操作了,但可以通过open函数再次建立关联关系。
文本文件的读写[20分钟]
引入:
主题:
在本节的开始已经介绍过文本文件的概念和存储方式,对文本文件的读写操作有以下两种方法:
1.利用流插入运算符“<<”和流提取运算符“>>”来输入输出标准类型的数据。
从流的层次结构图9.1.2中可以知道ifstream和ofstream分别是istream和ostream的派生类,因此继承了公用重载函数流插入运算符“<<”和流提取运算符“>>”,可以如同用cin,cout对标准设备进行读写一样,使用文件流插入流插入运算符“<<”和文件流提取运算符“>>”对磁盘文件进行读写。
示例讲解:
示例9.2.2实现对下列基本数据的读写:
整数:
123456789
浮点数:
59.560.1
字符串:
James
分析与解答:
具体见P423
2.使用文件流的put,get,getline等成员函数进行字符的输入/输出
这些成员函数的用法也与标准输入输出流中的函数用法一致,区别仅仅是将cout与cin对象改为自定义的文件流对象。
示例讲解:
示例9.2.3编写一个程序从键盘接收多行数据,直到输入$符为止,将数据存入文本文件。
再从文件中读出数据在屏幕显示,并将所有小写字符转为大写字符。
分析与解答:
具体见P425
练习:
练习9.2.1改写程序9_2_S_3,要求在最后显示文件中的大写字母的个数。
其结果应如图所示
解决:
见solution-code/E9-2-1.cpp
二进制文件的读写[15分钟]
引入:
主题:
二进制文件由于在存储形式上与文本文件有着根本不同,文本文件以ASCII码方式进行存储,而二进制文件是将内存数据不加转换的进行存储,因此在二进制文件的读写上与文本文件有以下不同之处:
(1)在打开文件时,要指明文件的存储方式为ios:
:
binary
(2)不能使用流插入运算符“<<“和流提取运算“>>”,及字符类型的输入与输出成员函数,因为这些函数为自动将读写内容转换为字符型数据,从而推动了二进制文件的特点。
读写二进制文件应使用流的成员函数read和write,下面将再次介绍这两个函数的使用。
函数的声明形式为
istream&read(char*buffer,intlen);
ostream&write(constchar*buffer,intlen);
字符指针buffer指向内存中一段存储空间。
这里之所以定义为字符指针,是因为一个字符占用一个字节,这样可以保证在读写数据是逐字节读出或写入。
所以如果使用的变量不是字符指针类型在使用时需要将其强制转换。
len是读写的字节数,一般不直接给出数值,而是使用sizeof运算符(请参看第1章扩展阅读sizeof运算符一节)求出字节数。
二进制文件的读写通常用于自定义数据类型的读写。
示例讲解:
示例9.2.4二进制文件的读写演示
分析与解答:
具体见P427
文件指针[15分钟]
引入:
主题:
在C++的文件流类中为了方便管理对文件的读写操作,设定了两个整数值用于指明当前应进行读写操作的位置,分别称为:
1.get指针:
指明下一次进行读操作时,在文件中的开始位置;每成功读出一个字节,将自动后移一位。
2.put指针:
指明下一次进行写操作时,在文件中的开始位置;每成功写入一个字节,将自动后移一位。
与文件指针有关的函数共6个,分两类,第一个类是与get指针有关:
●tellg():
用于返回当前get指针的值
●seekg(longpos):
将get指针移到指定位置pos
●seekg(longlen,longpos):
将get指针从指定位置pos,移动指定个数(len)的字节
“pos”可以是通常取以下3个在ios中的预定义值:
ios:
:
beg 文件开头(beg是begin的缩写),这是默认值
ios:
:
curget指针的当前位置(cur是current的缩写)
ios:
:
end文件尾
“len”可以为正数,也可以为负数,正数表示向后移,直到移到文件尾为止;负数表示前移,直到移到文件头为止。
第二类是与put指针有关的函数
●tellp():
用于返回当前put指针的值
●seekp(longpos):
将put指针移到指定位置pos
●seekp(longlen,longpos):
将put指针从指定位置pos,移动指定个数(len)的字节
这类函数的用法与上述get指针中几个函数的用法一样,只是定位的是put指针的位置而已。
[举例]
随机访问二进制文件[15分钟]
引入:
前面所介绍的文件读写都是按顺序进行的,即逐个字节的进行。
但是对于实际应用中的二进制文件往往需要对数据文件进行随机访问,如在文件中修改记录信息,以及按指定条件查询保存在数据中的记录。
主题:
在了解了文件指针的概念后,随机访问,实际上是要操作文件指针,根据需要将其定位在要读写的位置,再利用read,write函数进行读写即可。
示例讲解:
示例9.2.5二进制文件随机访问演示
分析与解答:
具体见P431
任务解决[30分钟]
任务:
由于现有HNS软件学院的图书管理系统,没有使用文件系统,造成大量的中间数据和操作结果无法保存。
因此系统分析部决定对该系统进行升级改造,通过使用文件I/O技术,使系统可以实现对图书和用户数据的存储,现指派您 完成如下任务:
1.使用文件系统存储图书数据,实现对图书数据的新增、修改、查询;
2.使用文件系统存储用户数据,实现对用户数据的新增、修改、查询。
分析与解决:
具体见P434-439
精练[45分钟]
任务:
请您根据本节所学的知识,参照任务1的解决方法,编写相应的程序实现对用户的管理,解决任务2。
要求:
1.将用户定义为一个用户类User
2.使用二进制文件存储User类型的记录,实现新增、查询、和修改功能
解决:
具体见P9-2.cpp
小结[2分钟]
通过本节的学习,您理解了文件的概念,掌握了使用文件流对象及其成员函数对文件进行读取的方法,并能运用所学的文件I/O知识来解决实际问题,下面将本节的主要内容归纳如下:
1.文件的基本概念
文件是指以一定格式存储在外部存储器(相对于CPU而言)上的数据集合,根据其存储格式的不同可以分为ASCII码文件和二进制文件,根据存储介质的不同可以分为硬盘文件、光盘文件、U盘文件。
2.文件流类与文件流对象
文件流是指以外存文件作为输入输出对象的数据流,其主要的流类有3个:
ifstream用于支持从文件中读入数据;
ofstream用于支持向文件中写入数据;
fstream用于支持对文件进行双向的读写操作
3.文件的打开与关闭
任何关于文件的操作都要先打开文件,再对文件进行读写,操作完毕后,要关闭文件。
用文件流对象打开文件时有两种方式:
调用文件流的成员函数open
在定义文件流对象时指定参数
关闭文件使用close函数。
4.文件的读写
文件的读写根据文件存储方式的不同,可以分为文本文件的读写和二进制文件的读写,根据访问顺序的不同可以分为顺序访问与随机访问,可以读写时数据类型的不同可以为基本数据类型的读写与自定义类型的读写。
文本文件的读写一般都是顺序进行的,其操作的数据也都是基本数据类型,因此主要使用两种操作方法:
用流插入运算符“<<”和流提取运算符“>>”输入输出基本数据类型
用文件流的put,get,getline等成员函数进行字符类型的输入/输出
二进制文件由于在存储形式上与文本文件有着根本不同,因此其在文件的打开方式上,读写使用的成员函数上都有所不同:
在打开二进制文件时,要指明文件的存储方式为ios:
:
binary
读写二进制文件应使用流的成员函数read和write
5.文件指针
在C++的文件流类中有两个文件指针,get指针与put指针分别用于文件的读写操作,可以使用下列函数来定位与获取两个指针的值:
●tellg():
用于返回当前get指针的值
●seekg(longpos):
将get指针移到指定位置pos
●seekg(longlen,longpos):
将get指针从指定位置pos,移动指定个数(len)的字节
●tellp():
用于返回当前put指针的值
●seekp(longpos):
将put指针移到指定位置pos
●seekp(longlen,longpos):
将put指针从指定位置pos,移动指定个数(len)的字节
6.随机访问二进制文件
可以结合文件指针定位函数与read、write函数来对二进制文件实现随机访问,其一般步骤如下:
(1)正确使用文件流类及设置关联文件的工作方式
(2)正确计算好每次访问时指针的定位
(3)正确执行文件的读写操作
技能提升[90分钟]
任务:
HNS软件学院的系统开发部目前正在为该院的图书馆开发一套图书管理系统,现已进入到了实现阶段。
要求实现一个在界面上具有字符菜单提示,可以保存图书和用户资料数据的图书馆系统。
现指派您在以前各章的开发基础上完成图书和用户的管理工作,其具体任务如下:
1.编写图书管理模块;
要求实现图书的新增,修改,查询,借书,还书功能
2.编写用户管理模块
要求实现用户的新增,修改,查询及登陆功能
3.编写界面显示模块
分析:
1.定义相关类
至少应包括:
Book 书籍类
User用户类
BookManager系统管理类
具体实现可参照第7章
2.为类增加文件存储的相关功能
(1)Book类中应增加下列方法
boolsaveToFile();//存盘
boolreadFromFile(longpos)//读数据 pos为在文件中位置
(2)用户类中应增加下列方法
boolsaveToFile();//存盘
boolreadFromFile(longpos)//读数据 pos为在文件中位置
其他方法的具体要求请参照本书的其他章节。
解决:
具体见9-2-A1.cpp
演示:
目标:
●提高学生的表达能力,语言应用能力和自信力
●展示所完成的任务
要求:
●学生应当使用面向对象的方法完成上述任务;
●普通话应尽可能标准流畅,不得使用方言
●需要结合本章的重点进行讲解
考核点
考核点1:
文件和文件流的概念和使用
考核点2:
二进制文件的操作
作业答案
1:
有如下表格,要求编写一个程序实现以下功能,
●新增功能:
从键盘接收数据,并保存在文件中
●查询功能:
给定姓名,查询身份证号码
以上功能可重复使用,直到输入Q时,退出程序。
答:
solution-code/9-2-T1cpp
2:
编写程序实现文件的备份功能(将原文件复制,并更改文件扩展名为.bak)
答:
solution-code/9-2-T2.cpp
3:
编写程序实现两个文件的合并功能。
答:
solution-code/9-2-T3.cpp
扩展练习
学生问题汇总
(注:
汇总学生在学习过程中容易出现的问题)
教学后记
(注:
在此写上个人在授课过程中所遇到的教案中所没有涉及到的特殊问题及其解决方法或解决方案,也可以总结自己的授课体会,课程体系、教材的不足等。
)
授课教师(签名):
授课时间:
授课班级: