【文档说明】面向对象分析与设计chapter_2686课件.ppt,共(35)页,288.604 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44883.html
以下为本文档部分文字说明:
面向对象分析与设计chapter_2686课件本章的教学内容流的概念文件输入/输出流类二进制模式的文件输入/输出校园信息管理系统中的数据输入、输出••6.1流的概念在C++中,将从一个对象到另一个对象的数据流动抽象地表示为“流”或流
对象。流动的方向不同,就产生不同的输入/输出流,即I/O流。在C++程序中,数据可以从键盘或磁盘文件流入到程序,形成输入流,也可以从程序流向屏幕或磁盘文件,形成输出流。在C++程序中,数据的输入/输出就是通过I/O流来实现的。一般地,每个流都是与某种设备相联系的对象,与输入设备(
如键盘)相联系的流称为输入流;与输出设备(如屏幕、打印机)相联系的流称为输出流;与输入/输出设备(如磁盘)相联系的流称为输入/输出流。C++为每种输入/输出流定义了一个流类,用流类来描述这些流。C++的流类构成一个流库。••6.2文件输入/输出流类
C++中负责文件输入/输出的类主要有:ifstream—文件输入流类;ofstream—文件输出流类;fstream—文件输入/输出流类。要使用fstream类执行文件的I/O时,必须定义一个fstream类的对象,然后使
用该对象调用fstream类提供的成员函数open打开一个文件,open函数的参数有两个,一个表示欲打开的磁盘文件的名称,另一个表示打开该文件的模式。例如:fstreamfile;file.open(“Myfile.t
xt”,ios::in);••表8-1文件的打开模式模式参数ios::inios::outios::ateios::appios::truncios::nocreateios::binary功能文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文
文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文ios::noreplace文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文
文文文文文文文••可用位或运算符OR(|)运算符将一些模式参数组合成一个模式参数:file.open(“MyFile.txt”,ios::in|ios::out|ios::binary);••fstream类继承了istream与ostream类中处理数据流输入和输出的成员函
数,因此可以实现文件的读写等操作。下表列出了fstream类中的一些常用的文件处理函数。表8-2文件处理函数函数open(filename,mode)close()is_open()write(str,size)read(str,size)功能説明文mode文文文文
文文文文filename文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文文str文size文文文文文文文文文文文文文文size文文文文文文文文str文••例6-1文件的操作#inlude<iostream>#include<fstream>usingna
mespacestd;voidmain(){constintsize=10;fstreamfile;//定义文件流类对象charstr_out[]=“string1”,str_in[size]
;file.open(“Myfile.txt”,ios::out|ios::trunc);file.write(str_out,size);//将str_out写入Myfile.txtfile.close();file.open(“Myfil
e.txt”,ios::in);file.read(str_in,size);••6.3.3二进制模式的文件I/O在二进制模式下,可利用write函数将内存中的数据以二进制串的形式直接输出到文件里存储,也可以用read从文件中以二进制串的形式读入数据到内存中。#include<i
ostream>#include<fstream>#include<iomanip>//格式化输入/出控制头文件usingnamespacestd;voidmain(){fstreamfile;charname[4][8]={“Mary”,“John”,“Judy”,“Joe”
};intid[4]={100,200,300,400};••file.open(“List.txt”,ios::out|ios:binary|ios::trunc);//打开文件为二进制输出模式if
(!file){cerr<<“Can’topenfile!\n”;exit(1);}for(inti=0;i<4;i++){file.write((char*)&id[i],sizeof(int));file.write((char*)&name[i],8*sizeof(char));}file
.close();chartname[8];inttid;file.open(“List.txt”,ios::in|ios:binary);//打开文件为二进制输出模式if(!file){cerr<<“Can’top
enfile!\n”;exit(1);}••cout<<setw(4)<<setiosflag(ios::right)<<“ID”<<setw(8)<<setiosflag(ios::right)<<“Name”<<endl;cout<<“-------
--------------\n”;file.read((char*)&tid,sizeof(int));//先读取一笔数据file.read(tname,8*sizeof(char));while(!file.eof())//循环读取记录,直到文件结
尾{cout<<setw(4)<<setioflags(ios::right)<<tid;<<setw(8)<<setioflags(ios::right)<<tname<<endl;file.read((char*)&id,sizeof(int));file.read(tname,8*si
zeof(char));}file.close();}IDName100Mary200John300Judy400Joe••6.4模板和标准模板库6.4.1模板的概念模板是对具有相同特性的类或函数的一般性描述,一个模板并非一个实实在在的类或函数,而是公式化或抽象化或参
数化的类或函数。模板可以分为类模板和函数模板。类模板是为一组数据属性相似但某些数据类型不同的类抽象定义的一种公式化类或抽象类。在类模板中某些数据成员、某些成员函数的参数或返回值类型可取任意类型。因此,类模板是数据类型
抽象化或参数化的类。••例8-2已知两个类A和B的定义,用类模板对这两个类进行抽象定义。classA{public:A(inty):x(y){}private:intx;}classB{public:B
(doubley):x(y){}private:doublex;}//用类模板实现template<classT>classC{public:C(Ty):x(y){}private:Tx;}C<int>a
;-----Aa;C<double>b;-----Bb;••6.4.2标准模板库STLSTL是StandardTemplateLibrary的缩写,表示标准模板库,它由许多模板组成。它能够满足软件开发的实际需要,是一种强健和高效的C++程序库。该库包含了许多在计算机科学领域里常用的基
本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可重用性。利用STL开发程序可以提高代码的重用度,让程序更加稳定,便于维护,提高编写程序的效率。••STL包含了一系列的容器类(containers),算法(algori
thms)和迭代器(iterators)。例如,STL定义了容器类list<T>--线性表类模板,用这个类模板可定义一个线性表:list<person*>AllPerson;//用于存储person类对象指针的线性表1Allperson2m„„person1pe
rson2personm••在线性表类中,还定义了迭代器类---iterator类。可用迭代器类来定义迭代器变量。迭代器变量有点像指针,算法通过迭代器变量来定位和操控容器中的元素。例如,下列语句定义了一个迭代器变量(或指针变量):list<perso
n*>::iteratorAllPersonIterator;intsum=0;for(AllPersonIterator=AllPerson.begin();AllPersonIterator!=A
llPserson.end();++AllPersonIterator)sum++;12mAllpersonAllpersonIterator=AllPerson.begin()AllpersonIterator=AllPerson.end()••6.5校园信息管理系统
中的数据存储通过前面的工作,我们的校园信息管理系统已经能够完成人员信息的输入和显示等一系列操作,但现在的程序并不能将信息长期保存,即程序关闭时数据会全部丢失。对于一个数据庞大的校园信息管理系统来说,不可能在每次程序运行时都重新输入全部信息
。所以,校园信息管理系统应该实现数据的永久保存功能。要想长期保存对象数据,必须在程序运行结束时将对象中的数据全部写入磁盘文件,以后程序运行时又可以读出这些数据。这样可以实现数据的永久保存。••在设计per
son,student和teacher类时,已声明了如下函数,但尚未定义:voidSave(ofstream*ofile);---将对象数据写出到文件中。voidLoad(ifstream*ifile);---从文件中读入数据。要存储对象就
是要将每个成员变量的值都存入文件中,比如以字符串形式存入文件。classperson{public:charname[10];charsex[10];charaddress[100];datebirthday;••voidperson::Save(ofstream*
ofile){ofile->write((char*)&type,sizeof(type));intlen=0;len=strlen(name);ofile->write((char*)&len,sizeof(int));ofile->write(name,len);len=str
len(sex);ofile->write((char*)&len,sizeof(int));ofile->write(sex,len);len=strlen(address);ofile->write((char*)&len,sizeof
(int));ofile->write(address,len);ofile->write((char*)&birthday,sizeof(date));}••voidperson::Load(ifstream*ifile)//将文件的信息读出{intlen=0;ifile
->read((char*)&len,sizeof(int));ifile->read(name,len);name[len]='\0';ifile->read((char*)&len,sizeof(in
t));ifile->read(sex,len);sex[len]='\0';ifile->read((char*)&len,sizeof(int));ifile->read(address,len);address[len]='\0';ifile->read((char*)&birthd
ay,sizeof(date));}••voidstudent::Save(ofstream*ofile){person::Save(ofile);//先调用基类Save函数intlen=0;len=strlen(sclass);ofile-
>write((char*)&len,sizeof(int));ofile->write(sclass,len);len=strlen(major);ofile->write((char*)&len,sizeof(int));ofile->write(major,len);ofi
le->write((char*)&sregister,sizeof(date));}••voidstudent::Load(ifstream*ifile)//读入数据{person::Load(ifile);//先调用基类Save函数
intlen=0;ifile->read((char*)&len,sizeof(int));ifile->read(sclass,len);sclass[len]='\0';ifile->read((char*)&len,sizeof(int));ifile->read(major,len);
major[len]='\0';ifile->read((char*)&sregister,sizeof(date));}••voidteacher::Save(ofstream*ofile)//写入文件{person::Save(ofile);//先调用基类Save函数ofi
le->write((char*)&tregister,sizeof(date));}voidteacher::Load(ifstream*ifile)//读入数据{person::Load(ifile);//先调用基类
Save函数ifile->read((char*)&tregister,sizeof(date));}••voidmain(){charcmd[64];cout<<"欢迎进入校园信息管理系统v1.0"<<endl;cout<<"请选择你要进行的
操作:"<<endl;do{cout<<">";cin>>cmd;if(strcmp(cmd,"exit")==0){if(exitCMD()){break;}}elseif(strcmp(cmd,"help")==0||strcmp
(cmd,"?")==0){helpCMD();}elseif(strcmp(cmd,"input")==0){inputCMD();}elseif(strcmp(cmd,"output")==0){outputCMD();}elseif(strcmp
(cmd,"analyze")==0){analyzeCMD();}elseif(strcmp(cmd,"save")==0){saveCMD();}elseif(strcmp(cmd,"load")==0){loadCMD();}else{cout<<"错误:无指定命令,输入help查看帮助!
"<<endl;}}while(true);}••#include<list>//引用类库list,通过std调用usingnamespacestd;list<person*>AllPerson;//定义线性表对象voidinputCMD()//输入
数据{cout<<"[A]输入学生信息"<<endl;cout<<"[B]输入教师信息"<<endl;charbInfo;cin>>bInfo;if(bInfo=='a'||bInfo=='A'){student*s=newstudent();//创建学生对象s->Read()
;//输入学生数据AllPerson.push_back((person*)s);//将对象实例存入顺序表cout<<"成功输入学生信息"<<endl;}••elseif(bInfo=='b'||bInfo=='B')
{teacher*t=newteacher();//创建教师对象t->Read();//输入学生数据AllPerson.push_back((person*)t);//将对象实例存入顺序表cout<<"成功输入教师信息"<<endl;}else{cout<<"输入失
败!请选择输入学生或教师信息"<<endl;}••voidoutputCMD()//输出数据{list<person*>::iteratorAllPersonIterator;inti=0;for(AllPersonIterator=AllPerson.begin();Al
lPersonIterator!=AllPerson.end();AllPersonIterator++){i++;cout<<"----NO."<<i<<"----"<<endl;(*AllPersonIterator)->Show();//调
用链表显示输入的数据}}12mAllpersonAllpersonIterator=AllPerson.begin()AllpersonIterator=AllPerson.end()••voidanalyzeCMD()/
/统计分析数据{list<person*>::iteratorAllPersonIterator;intsum=0,nstu=0,ntea=0;//初始化计数for(AllPersonIterator=AllPerson.begin();AllP
ersonIterator!=AllPerson.end();AllPersonIterator++){if((*AllPersonIterator)->type==STUDENT)nstu++;//如果是学生,学生人数加1if((*AllPerson
Iterator)->type==TEACHER)ntea++;//如果是教师,教师人数加1sum++;//总人数加1••voidsaveCMD()//将数据存入文件{ofstreamofile("person.dat",ios::binary
|ios::trunc);list<person*>::iteratorAllPersonIterator;intsum=0;for(AllPersonIterator=AllPerson.begin();AllPersonIterato
r!=AllPerson.end();AllPersonIterator++)sum++;ofile.write((char*)&sum,5);••for(AllPersonIterator=AllPerson.begin();AllPersonIterator!=AllPerson
.end();AllPersonIterator++){(*AllPersonIterator)->Save(&ofile);}ofile.close();cout<<"成功保存"<<sum<<"人信息"<<endl;}12mAllpersonAll
personIterator=AllPerson.begin()AllpersonIterator=AllPerson.end()••voidloadCMD()//将数据从文件读出{ifstreamifile("person.dat"
);list<person*>::iteratorAllPersonIterator;intsum=0;ifile.read((char*)&sum,4);for(inti=0;i<sum;i++){ptypetype;ifile.read((char*)
&type,sizeof(type));••if(type==STUDENT){student*s=newstudent();s->Load(&ifile);AllPerson.push_back((person*)s);}i
f(type==TEACHER){teacher*t=newteacher();t->Load(&ifile);AllPerson.push_back((person*)t);}}ifile.close();cout<<"成功读取"
<<sum<<"人信息"<<endl;}••voidmain(){charcmd[64];cout<<"欢迎进入校园信息管理系统v1.0"<<endl;cout<<"请选择你要进行的操作:"<<endl
;do{cout<<">";cin>>cmd;if(strcmp(cmd,"exit")==0){if(exitCMD()){break;}}elseif(strcmp(cmd,"help")==0||strcmp(cmd,"?")==0){helpCMD();}elseif(strc
mp(cmd,"input")==0){inputCMD();}elseif(strcmp(cmd,"output")==0){outputCMD();}elseif(strcmp(cmd,"analyze")==0){analyzeCMD(
);}elseif(strcmp(cmd,"save")==0){saveCMD();}elseif(strcmp(cmd,"load")==0){loadCMD();}else{cout<<"错误:无指定命令,输入help查看帮助!"
<<endl;}}while(true);}••习题和实验题(项目设计):1、阅读校园信息管理系统参考程序,补充main()函数,实现让用户从提示菜单中选择输入命令和执行命令的操作。2、写出项目设计报告,内容包括:(1)要求写出系统分析和设计;(2)对程序系统中的i
nputCMD(),outputCMD(),saveCMD()和loadCMD()进行完善并对其中的每一条语句作注释。(3)自己在本次项目设计过程中的体会。••