面向对象分析与设计chapter-2686课件_第1页
面向对象分析与设计chapter-2686课件_第2页
面向对象分析与设计chapter-2686课件_第3页
面向对象分析与设计chapter-2686课件_第4页
面向对象分析与设计chapter-2686课件_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、面向对象分析与设计chapter_2686课件面向对象分析与设计chapter_2686课件本章的教学内容流的概念 文件输入/输出流类二进制模式的文件输入/输出校园信息管理系统中的数据输入、输出本章的教学内容流的概念 6.1 流的概念在C+中,将从一个对象到另一个对象的数据流动抽象地表示为“流”或流对象。流动的方向不同,就产生不同的输入/输出流,即I/O流。在C+程序中,数据可以从键盘或磁盘文件流入到程序,形成输入流,也可以从程序流向屏幕或磁盘文件,形成输出流。在C+程序中,数据的输入/输出就是通过I/O流来实现的。一般地,每个流都是与某种设备相联系的对象,与输入设备(如键盘)相联系的流称为输

2、入流;与输出设备(如屏幕、打印机)相联系的流称为输出流;与输入/输出设备(如磁盘)相联系的流称为输入/输出流。C+为每种输入/输出流定义了一个流类,用流类来描述这些流。C+的流类构成一个流库。6.1 流的概念在C+中,将从一个对象到另一个对象的数据流6.2 文件输入/输出流类C+中负责文件输入/输出的类主要有:ifstream文件输入流类;ofstream文件输出流类;fstream 文件输入/输出流类。要使用fstream类执行文件的I/O时,必须定义一个fstream类的对象,然后使用该对象调用fstream类提供的成员函数open打开一个文件,open函数的参数有两个,一个表示欲打开的磁

3、盘文件的名称,另一个表示打开该文件的模式。例如: fstream file; file.open(“Myfile.txt”,ios:in);6.2 文件输入/输出流类C+中负责文件输入/输出的类主要面向对象分析与设计chapter_2686课件可用位或运算符 OR (|)运算符 将一些模式参数组合成一个模式参数: file.open(“MyFile.txt”, ios:in|ios:out|ios:binary);可用位或运算符 OR (|)运算符 fstream类继承了istream与ostream类中处理数据流输入和输出的成员函数,因此可以实现文件的读写等操作。下表列出了fstream类中

4、的一些常用的文件处理函数。fstream类继承了istream与ostream类中处理例6-1 文件的操作 #inlude #include using namespace std; void main() const int size=10; fstream file; /定义文件流类对象 char str_out=“string1”, str_insize; file.open(“Myfile.txt”,ios:out|ios:trunc); file.write(str_out,size); /将str_out写入Myfile.txt file.close(); file.open(“M

5、yfile.txt”,ios:in); file.read(str_in,size); file.close(); cout“Reading data from filen”str_inend;例6-1 文件的操作6.3.3 二进制模式的文件I/O 在二进制模式下,可利用write函数将内存中的数据以二进制串的形式直接输出到文件里存储,也可以用read从文件中以二进制串的形式读入数据到内存中。 #include #include #include /格式化输入/出控制头文件 using namespace std; void main() fstream file; char name48=“

6、Mary”,“John”, “Judy”,“Joe”; int id4=100,200,300,400; 6.3.3 二进制模式的文件I/Ofile.open(“List.txt”,ios:out|ios:binary|ios:trunc); /打开文件为二进制输出模式if(!file) cerr“Cant open file!n”; exit(1); for (int i=0; i4; i+) file.write(char*)&idi,sizeof(int); file.write(char*)&namei,8*sizeof(char); file.close();char tname8;

7、int tid;file.open(“List.txt”,ios:in|ios:binary); /打开文件为二进制输出模式if(!file) cerr“Cant open file!n”; exit(1); file.open(“List.txt”,ios:out|coutsetw(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

8、 (!file.eof() /循环读取记录,直到文件结尾 coutsetw(4)setioflags(ios:right)tid; setw(8) setioflags(ios:right)tnameendl; file.read(char*)&id,sizeof(int); file.read(tname,8*sizeof(char);file.close();coutsetw(4)setiosflag(ios:6.4 模板和标准模板库6.4.1 模板的概念模板是对具有相同特性的类或函数的一般性 描述,一个模板并非一个实实在在的类或函数,而是公式化或抽象化或参数化的类或函数。模板可以分为类模

9、板和函数模板。类模板是为一组数据属性相似但某些数据类型不同的类抽象定义的一种公式化类或抽象类。在类模板中某些数据成员、某些成员函数的参数或返回值类型可取任意类型。因此,类模板是数据类型抽象化或参数化的类。6.4 模板和标准模板库6.4.1 模板的概念例8-2 已知两个类A和B的定义,用类模板对这两个类进行抽象定义。class A public: A(int y):x(y) private: int x; class B public: B(double y): x(y) private: double x; /用类模板实现template class C public: C(T y): x(y

10、) private: T x; C a; - A a;C b; - B b;例8-2 已知两个类A和B的定义,用类模板对这两个类进行抽象6.4.2 标准模板库STLSTL 是Standard Template Library的缩写,表示标准模板库,它由许多模板组成。它能够满足软件开发的实际需要,是一种强健和高效的C+程序库。该库包含了许多在计算机科学领域里常用的基本数据结构和基本算法。为广大C+程序员们提供了一个可扩展的应用框架,高度体现了软件的可重用性。 利用STL开发程序可以提高代码的重用度,让程序更加稳定,便于维护,提高编写程序的效率。6.4.2 标准模板库STLSTL 是Standar

11、d TeSTL包含了一系列的容器类(containers),算法(algorithms)和迭代器(iterators)。例如,STL定义了容器类 list-线性表类模板,用这个类模板可定义一个线性表: list AllPerson; /用于存储person类对象指针的线性表STL包含了一系列的容器类(containers),算法(a在线性表类中,还定义了迭代器类-iterator 类。 可用迭代器类来定义迭代器变量。迭代器变量有点像指针,算法通过迭代器变量来定位和操控容器中的元素。例如,下列语句定义了一个迭代器变量(或指针变量): list:iterator AllPersonIterator

12、; int sum=0; for (AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPserson.end(); +AllPersonIterator) sum+; 在线性表类中,还定义了迭代器类-iterator 类。6.5 校园信息管理系统中的数据存储 通过前面的工作,我们的校园信息管理系统已经能够完成人员信息的输入和显示等一系列操作,但现在的程序并不能将信息长期保存,即程序关闭时数据会全部丢失。对于一个数据庞大的校园信息管理系统来说,不可能在每次程序运行时都重新输入全部信息。所以,校园信息管理系统应该实现数据的永久保存

13、功能。 要想长期保存对象数据,必须在程序运行结束时将对象中的数据全部写入磁盘文件,以后程序运行时又可以读出这些数据。这样可以实现数据的永久保存。6.5 校园信息管理系统中的数据存储 通过前在设计person,student和teacher类时,已声明了如下函数,但尚未定义: void Save(ofstream* ofile);-将对象数据写出到文件中。 void Load(ifstream* ifile); -从文件中读入数据。 要存储对象就是要将每个成员变量的值都存入文件中,比如以字符串形式存入文件。 class person public: char name10; char sex10

14、; char address100; date birthday; ptype type; virtual void Save(ofstream* ofile); virtual void Load(ifstream* ifile); ;在设计person,student和teacher类时,已声void person:Save(ofstream* ofile) ofile-write(char*)&type,sizeof(type);int len=0;len=strlen(name);ofile-write(char*)&len, sizeof(int);ofile-write(name,

15、len); len=strlen(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);void person:Save(ofstream* ofvoid person:Load(ifstream* ifile)/将文件的信息读出int len=0;ifile-read(cha

16、r*)&len, sizeof(int);ifile-read(name,len); namelen=0;ifile-read(char*)&len, sizeof(int);ifile-read(sex, len); sexlen=0; ifile-read(char*)&len, sizeof(int);ifile-read(address, len); addresslen=0;ifile-read(char*)&birthday, sizeof(date);void person:Load(ifstream* ifvoid student:Save(ofstream* ofile)pe

17、rson:Save(ofile); /先调用基类Save函数int len=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); ofile-write(char*)&sregister, sizeof(date);void student:Save(ofstream* ovoid student:Load(ifstream*

18、ifile) / 读入数据person:Load(ifile); /先调用基类Save函数int len=0;ifile-read(char*)&len, sizeof(int);ifile-read(sclass, len); sclasslen=0;ifile-read(char*)&len, sizeof(int);ifile-read(major, len); majorlen=0;ifile-read(char*)&sregister,sizeof(date);void student:Load(ifstream* ivoid teacher:Save(ofstream* ofile

19、) /写入文件person:Save(ofile);/先调用基类Save函数 ofile-write(char*)&tregister, sizeof(date);void teacher:Load(ifstream* ifile)/ 读入数据 person:Load(ifile); /先调用基类Save函数 ifile-read(char*)&tregister, sizeof(date);void teacher:Save(ofstream* ovoid main() char cmd64;cout欢迎进入校园信息管理系统v1.0endl;cout请选择你要进行的操作:endl;do co

20、ut; cincmd;if (strcmp(cmd,exit)=0) if( exitCMD() ) break; else if ( strcmp(cmd,help)=0 | strcmp(cmd,?)=0) helpCMD(); else if ( strcmp(cmd,input)=0 ) inputCMD(); else if ( strcmp(cmd,output)=0 ) outputCMD(); else if ( strcmp(cmd,analyze)=0 ) analyzeCMD(); else if ( strcmp(cmd,save)=0 ) saveCMD(); els

21、e if ( strcmp(cmd,load)=0 ) loadCMD(); else cout错误:无指定命令,输入help查看帮助!endl;while(true); void main()#include /引用类库list,通过std调用using namespace std;list AllPerson; /定义线性表对象void inputCMD() /输入数据 coutA输入学生信息endl; coutB输入教师信息bInfo;if (bInfo=a| bInfo=A) student* s=new student(); /创建学生对象 s-Read(); /输入学生数据 All

22、Person.push_back(person*)s); /将对象实例存入顺序表 cout成功输入学生信息endl; #include /引用类库list,通过else if (bInfo=b |bInfo=B) teacher* t=new teacher(); /创建教师对象 t-Read(); /输入学生数据 AllPerson.push_back(person*)t); /将对象实例存入顺序表 cout成功输入教师信息endl; else cout输入失败!请选择输入学生或教师信息endl; else if (bInfo=b |bInfo=void outputCMD() /输出数据l

23、ist :iterator AllPersonIterator;int i=0;for(AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPerson.end(); AllPersonIterator+) i+; cout-NO.i-Show(); /调用链表显示输入的数据 void outputCMD() /输出数据void analyzeCMD() /统计分析数据 list :iterator AllPersonIterator;int sum=0, nstu=0, ntea=0; /初始化计数for (AllPerson

24、Iterator=AllPerson.begin(); AllPersonIterator!=AllPerson.end(); AllPersonIterator+) if (*AllPersonIterator)-type=STUDENT) nstu+; /如果是学生,学生人数加1if (*AllPersonIterator)-type=TEACHER) ntea+;/如果是教师,教师人数加1 sum+;/总人数加1cout当前总人数为:sumendl;cout其中教师共:ntea人,“ 学生共:nstu人,endl;void analyzeCMD() void saveCMD() /将数据

25、存入文件 ofstream ofile(person.dat, ios: binary|ios:trunc); list :iterator AllPersonIterator;int sum=0; for (AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPerson.end(); AllPersonIterator+) sum+;ofile.write(char*)&sum,5);void saveCMD() /将数据存入文件for (AllPersonIterator=AllPerson.begin(); AllPersonIterator!=AllPerson.end(); AllPersonIterator+) (*AllPersonIterator)-Save(&ofile); ofile.close();cout成功保存sum人信息endl; for (AllPersonIterator=AllPersvoid loadCMD() /将数据从文件读出ifstream ifile(person.dat);list :iterator AllPersonIterator;int sum=0;ifile.read(char*)&sum,4); for (int i=0; iLoad(&

温馨提示

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

最新文档

评论

0/150

提交评论