版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九讲C++面向对象程序设计〔六〕张仕数学与计算机科学学院E-mail:1教学提纲一、教学内容:文件流操作二、学时:两课时三、教学目的和要求掌握文件和文件流的概念掌握文件翻开、关闭和读写的方法掌握顺序文件和随机文件的操作方法四、教学重点和难点重点:文件的读写难点:随机文件的操作2四.教学过程提要文件和文件流的概念文件的翻开、关闭和读写顺序文件随机文件布置作业题目和实验3内容提要3.11文件流操作4先看一个例子:#include<fstream.h>voidmain()//程序从这里开始运行{ ofstreamSaveFile("e:\\f1.txt"); SaveFile<<"HelloWorld!"; SaveFile.close();}53.11文件流文件的概念和分类文件是指存储在存储介质上的数据的集合。C++将文件看作是由一个一个字符〔字节〕的数据顺序组成的。按照文件中数据的存放形式可以将文件分为:ASCII文件和二进制文件。6文本文件和二进制文件从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。
ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为:
ASC码:00110101001101100011011100111000
↓↓↓↓
十进制码:5678共占用4个字节。ASCII码文件可在屏幕上按字符显示。由于是按字符显示,因此能读懂文件内容。7二进制文件是按二进制的编码方式来存放文件的。例如,数5678的存储形式为:0001011000101110只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C++系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也把这种文件称作“流式文件”。83.11.2文件的读写与文件指针“文件指针”是指表示读写文件的文件位置指示器。一个文件指针总是和一个文件相关联,当文件每一次翻开时,文件指针都指向文件的开始,随着对文件进行操作,文件指针不断地在文件中移动,并一直指向最新处理的字符〔字节〕位置。对文件的读写操作方式有两种方式:顺序文件操作和随机文件操作。9C++中与文件处理相关的类及其继承关系结构图iosistreamostreamifstreamiostreamofstreamfstream10文件操作包括翻开文件、读写文件和关闭文件3个步骤。文件的翻开和关闭是通过使用fstream类的成员函数open和close来实现的。fstream类的头文件是fstream.h1.翻开文件翻开文件应使用成员函数open(),该成员函数的函数原型为:voidopen(constunsignedchar*szName,intnMode,intnProt=filebuf::openprot);11其中:szName是一个字符型指针,指定了要翻开的文件名;nMode指定文件的翻开方式,见表3.11-1。nProt指定了文件的保护属性,其取值为:0
Compatibilitysharemode1
Exclusivemode—nosharing2
Readsharingallowed3
Writesharingallowed.12表3.11-1在ios类中定义的文件翻开方式文件打开方式含义ios::in以输入(读)方式打开文件ios::out以输出(写)方式打开文件ios::app打开一个文件使新的内容始终添加在文件的末尾ios::ate打开一个文件使新的内容添加在文件尾,但下一次添加时,写在当前位置处ios::trunc若文件存在,则清除文件所有内容;若文件不存在,则创建新文件ios::binary以二进制方式打开文件,缺省时以文本方式打开文件ios::nocreat打开一个已有文件,若该文件不存在,则打开失败ios::noreplace若打开的文件已经存在,则打开失败13翻开文件例子:fstreamf1;f1.open("d:\\vc\\test1.txt",ios::in);fstreamf2;f2.open("d:\\vc\\test2.txt",ios::out|ios::trunc);14几点说明:〔1〕在实际使用过程中,可根据需要将以上翻开文件的方式用“|”组合起来。如:ios::in|ios::out表示以读/写方式翻开文件ios::in|ios::binary表示以二进制读方式翻开文件ios::out|ios::binary表示以二进制写方式翻开文件ios::in|ios::out|ios::binary表示以二进制读/写方式翻开文件〔2〕如果未指明以二进制方式翻开文件,那么默认是以文本方式翻开文件。152.关闭文件在文件操作结束时应及时调用成员函数close()来关闭文件。如:要关闭的文件对象名为myfile,那么可使用如下语句关闭文件: myfile.close();163.文件的读写在翻开文件后就可以对文件进行读写操作了。从一个文件中读出数据,可以使用iostream类的get、getline、read成员函数以及运算符“>>”;而向一个文件写入数据,可以使用其put、write函数以及插入符“<<”。17iostream的文件操作常用的函数函数原型说明get(char&ch)从文件中读取一个字符getline(char*pch,intcount,chardelim=’\n’)从文件中读取多个字符,读取个数由参数count决定,参数delim是读取字符时指定的结束符read(char*pch,intcount)从文件中读取多个字符,读取个数由参数count决定put(charch)向文件写入一个字符write(constchar*pch,intcount)向文件写入多个字符,字符个数由count决定183.11.3顺序文件的操作从文件的第一个字符〔字节〕开始顺序地处理到文件的最后一个字符〔字节〕。从一个文件中读出数据,可以使用get、getline、read函数以及提取符“>>”;而向一个文件写入数据,可以使用put、write函数以及插入符“<<”。19【例3.11-1】向顺序文件的读写操作#include<iostream.h>#include<fstream.h> //文件操作必须的头文件voidmain(){ fstreamfile1; //定义一个fstream类的对象用于读 file1.open("Ex_DataFile.txt",ios::in); if(!file1) { cout<<"Ex_DataFile.txt不能翻开!\n"; return; } fstreamfile2; //定义一个fstream类的对象用于写 file2.open("Ex_DataFileBak.txt",ios::out|ios::trunc);20 if(!file2) { cout<<"Ex_DataFileBak.txt不能创立!\n"; file1.close(); return; }charch;while(file1.get(ch)) //或:file1.read(&ch,1){ cout<<ch; file2.write(&ch,1);//或:file2<<ch} file2.close();//不要忘记文件使用结束后要及时关闭 file1.close();}21【例3.11-2】有一个整型数组,含10个元素,从键盘输入10个整数给数组,将此数组存到磁盘文件中.#include“fstream.h”intmain(){inta[10];ofstreamoutfile("f1.dat",ios::out); //定义文件流对象,翻开磁盘文件″f1.dat″if(!outfile)//如果翻开失败,outfile返回0值{cout<<"openerror!"<<endl;return(1);}22
cout<<"enter10integernumbers:"<<endl;for(inti=0;i<10;i++){cin>>a[i];outfile<<a[i]<<"";//向磁盘文件输出数据}outfile.close();//关闭磁盘文件″f1.dat″return0;}23运行情况如下:enter10integernumbers请注意:在向磁盘文件输出一个数据后,要输出一个(或几个)空格或换行符,以作为数据间的分隔,否那么以后从磁盘文件读数据时,10个整数的数字连成一片无法区分。24【例3.11_3】从例3.11_2建立的数据文件f1.dat中读入10个整数放在数组中,找出并输出10个数中的最大者和它在数组中的序号。#include“fstream.h”intmain(){inta[10],max,i,order;ifstreaminfile(“f1.dat”,ios::in|ios::nocreate);//定义输入文件流对象,以输入方式翻开磁盘文件f1.datif(!infile){cout<<“openerror!”<<endl;return(1);}25for(i=0;i<10;i++){infile>>a[i]; //从磁盘文件读入10个整数,顺序存放在a数组中cout<<a[i]<<"″; }//在显示器上顺序显示10个数cout<<endl;max=a[0];order=0;26for(i=1;i<10;i++)if(a[i]>max){max=a[i];//将当前最大值放在max中order=i;//将当前最大值的元素序号放在order中}cout<<″max=″<<max<<endl<<″order=″<<order<<endl;infile.close();return0;}273.11.4随机文件操作随机文件操作,即在文件中通过C++相关的函数移动文件指针,并指向所要处理的字符〔字节〕。〔1〕在istream类中提供了3个操作读指针的成员函数:istream&istream::seekg(longpos);istream&istream::seekg(longoff,ios::seek_dirdir);streamposistream::tellg();28其中,pos为文件指针的绝对位置;off为文件指针的相对偏移量;dir为文件指针的参照位置,其值可能为:ios::cur 文件指针的当前位置ios::beg 文件开头ios::end 文件尾tellg()函数没有参数,它返回一个long型值,用来表示从文件开始处到当前指针位置之间的字节数。29〔2〕在ostream类中同样提供了3个操作写指针的成员函数:ostream&istream::seekp(longpos);ostream&istream::seekp(longoff,dir);streamposistream::tellp();这3个成员函数的含义与前面3个操作读指针成员函数的含义相同,只不过它们是用来操作写指针的。30【例3.11_4】将一批数据以二进制形式存放在磁盘文件中。#include"fstream.h"structstudent{charname[20];intnum;intage;charsex;};intmain(){studentstud[3]={"Li",1001,18,'f',"Fun",1002,19,'m',"Wang",1004,17,'f'};31ofstreamoutfile("e:\\stud.dat",ios::binary);if(!outfile){cout<<"openerror!"<<endl;return1;//退出程序}for(inti=0;i<3;i++)outfile.write((char*)&stud[i],sizeof(stud[i]));outfile.close();return0;}32【例3.11_5】将3.11_4以二进制形式存放在磁盘文件中的数据读入内存并在显示器上显示。#include"fstream.h"structstudent{ charname[20]; intnum; intage; charsex;};intmain(){ studentstud[3]; inti; ifstreaminfile("stud.dat",ios::binary);33 if(!infile) { cout<<"openerror!"<<endl; return(0); } for(i=0;i<3;i++) infile.read((char*)&stud[i],sizeof(stud[i])); infile.close(); for(i=0;i<3;i++) { cout<<"NO."<<i+1<<endl; cout<<"name:"<<stud[i].name<<endl; cout<<"num:"<<stud[i].num<<endl;; cout<<"age:"<<stud[i].age<<endl; cout<<"sex:"<<stud[i].sex<<endl<<endl; } return0;}34问题:如果只想读出第2个学生的信息,如何修改程序?35【例3.11_6】重载流输出输入运算符读写随机文件的#include<iostream.h>#include<iomanip.h>#include<fstream.h>#include<string.h>classCStudent{public: CStudent(char*name,char*id,floatscore=0); voidprint(); friendostream&operator<<(ostream&os,CStudent&stu); friendistream&operator>>(istream&is,CStudent&stu);private: charstrName[10]; //姓名 charstrID[10]; //学号 floatfScore; //成绩};36续例3.11_6CStudent::CStudent(char*name,char*id,floatscore){ strncpy(strName,name,10); strncpy(strID,id,10); fScore=score;}voidCStudent::print(){ cout<<endl<<"学生信息如下:"<<endl; cout<<"姓名:"<<strName<<endl; cout<<"学号:"<<strID<<endl; cout<<"成绩:"<<fScore<<endl;}37ostream&operator<<(ostream&os,CStudent&stu){ os.write(stu.strName,10); os.write(stu.strID,10); os.write((char*)&stu.fScore,4); returnos;}istream&operator>>(istream&is,CStudent&stu){ charname[10]; charid[10]; is.read(name,10); is.read(id,10); is.read((char*)&stu.fScore,4); strncpy(stu.strName,name,10); strncpy(stu.strID,id,10); returnis;}续例3.11_638voidmain(){ CStudentstu1("MaWenTao","99001",88); CStudentstu2("LiMing","99002",92); CStudentstu3("WangFang","99003",89); CStudentstu4("YangYang","99004",90); CStudentstu5("DingNing","99005",80); fstreamfile1; file1.open("student.dat",ios::out|ios::in|ios::binary); file1<<stu1<<stu2<<stu3<<stu4<<stu5; CStudent*one=newCStudent("",""); constintsize=sizeof(CStudent); file1.seekp(size*4); file1>>*one; one->print();续例3.11_639续例3.11_6 file1.seekp(size*1); file1>>*one; one->print(); file1.seekp(size*2,ios::cur); file1>>*one; one->print(); file1.close(); deleteone;}40续例3.11_6运行结果如下:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《接触网施工》课件 5.1.2 避雷器安装
- 《岛》读后感:对2024年科学的启示
- 陀螺知识普及:2024年《陀螺》
- 人教部编版《道德与法治》二年级上册第9课《这些是大家的》精美课件(第1课时)
- 第二届全国技能大赛珠宝加工项目江苏省选拔赛技术工作文件
- 第47届世界技能大赛车身修理项目江苏省选拔赛(初稿)
- 2022年衢州市职业技能大赛中式烹调师项目技术文件
- 2024海滨小城校园安全讲座
- 2024年教育理念:《狐假虎威》与当代教育理念的融合
- 2024年视角:重构《垃圾分类》教案
- 食管炎的护理查房
- 《教育的初心》读书分享
- 软件工程生涯发展展示
- 基于PLC的热水箱恒温控制系统
- 医疗机构校验管理课件
- 药物临床试验突发事件应急预案
- 《继电保护培训》课件
- 医院装饰工程服务方案
- 麻醉及应激反应调控
- 《数字经济学》 课件 专题4:数字货币与数字金融研究
- 以瞄准我的妹妹没剪板
评论
0/150
提交评论