面向对象程序设计—第九章_第1页
面向对象程序设计—第九章_第2页
面向对象程序设计—第九章_第3页
面向对象程序设计—第九章_第4页
面向对象程序设计—第九章_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

1、第第九九章章 I/O流流9.1、I/O流类库概述流类库概述9.2、输入输出及其格式控制、输入输出及其格式控制9.3、用户自定义输入输出、用户自定义输入输出9.4、文件输入输出、文件输入输出9.1、I/O流类库概述流类库概述C语言中语言中, I/O只是为处理内部数据类型(如整型等)只是为处理内部数据类型(如整型等)设计的设计的1、输入、输出流、输入、输出流但是在但是在C+语言中情况发生了变化,由于类的引入,语言中情况发生了变化,由于类的引入,可以自定义自己所需的类型,可以自定义自己所需的类型,C+流流就是为了适应就是为了适应这种情况而引入的。这种情况而引入的。I/O流类流类I/O流对象流对象9.

2、1、I/O流类库概述流类库概述C+语言中,输入和输出操作由语言中,输入和输出操作由“流流”来处理。来处理。流流:数据从一个地方流到另一个地方。:数据从一个地方流到另一个地方。 即:编程者可以将要输入或者输出的数据看作一即:编程者可以将要输入或者输出的数据看作一个字节流,而不用考虑要访问设备的特定的细节个字节流,而不用考虑要访问设备的特定的细节流流:实际上是一个流对象:实际上是一个流对象 可以创建、删除;可以创建、删除; 可以向其中插入数据(可以向其中插入数据(写写),从其中获取数据),从其中获取数据 (读读) 9.1、I/O流类库概述流类库概述C+中的预定义流中的预定义流(对象)(对象):ci

3、n 与标准输入设备与标准输入设备相关联相关联的输入流的输入流cout 与标准输出设备相关联的输出流与标准输出设备相关联的输出流 cerr 与标准错误输出设备相关联的输出与标准错误输出设备相关联的输出流(不缓冲)流(不缓冲)clog 与标准错误输出设备相关联的输出与标准错误输出设备相关联的输出流(缓冲)流(缓冲) cerr 和和 clog都是显示错误信息的流,一般情况下使用都是显示错误信息的流,一般情况下使用cerr, 因为因为cerr是非缓冲方式的,所以错误信息输出后,用户能够是非缓冲方式的,所以错误信息输出后,用户能够立即看到,而不是发送到缓冲区,待缓冲区满了后才显示到立即看到,而不是发送到

4、缓冲区,待缓冲区满了后才显示到显示终端显示终端9.1、I/O流类库概述流类库概述C流类库是用继承方法建立起来的一个输入输出流类库是用继承方法建立起来的一个输入输出类库,它具有两个平行的基类,即类库,它具有两个平行的基类,即steambuf类和类和ios类,所有其他的流类都是从它们直接或间接地派类,所有其他的流类都是从它们直接或间接地派生出来的生出来的2、输入、输出流类库、输入、输出流类库steambuf类:提供物理设备的接口,它提供缓冲或类:提供物理设备的接口,它提供缓冲或处理流的通用方法处理流的通用方法ios类:是流类库的一个基类,它派生出输入流类类:是流类库的一个基类,它派生出输入流类is

5、tream,输出流,输出流ostream,文件流类,文件流类fstreambase和串流类和串流类strstrambase。为用户提供。为用户提供了使用流类的接口了使用流类的接口9.1、I/O流类库概述流类库概述C 输入、输出流类库的继承图输入、输出流类库的继承图iostream.h流类的继承体系流类的继承体系ostreamistreamiostreamiosclogfstreamcerrcinofstreamifstreamcout在文件在文件iostream.h中声明中声明标准流标准流 ios是流类的基类,图中的箭头代表类之间的继承关系,靠近箭头的那边是基类,另外的一边是派生类9.2、输入

6、输出及其格式控制输入输出及其格式控制1、预定义预定义输出流对象输出流对象cout2、预定义预定义输输入入流对象流对象cin3、成员函数格式控制、成员函数格式控制4、操纵符格式控制操纵符格式控制9.2、输入输出及其格式控制输入输出及其格式控制cout : 在在iostream.h中定义中定义的的ostream类的一个类的一个全全局对象,局对象,与标准输出设备(终端屏幕)与标准输出设备(终端屏幕)相关联:相关联: ostream cout(stdout); /stdout是标准设备是标准设备, ostream构造函数的参数构造函数的参数1、预定义预定义输出流对象输出流对象输出操作符输出操作符 :

7、是每个基本数据类型的友元,比如在是每个基本数据类型的友元,比如在iostream.h中中 :ostream& operator (char *pSource); /针对字符串针对字符串ostream& operator (int source); /针对整型针对整型9.2、输入输出及其格式控制输入输出及其格式控制对于下面的语句对于下面的语句: cout “My name is Joe” ;故匹配上面的故匹配上面的”ostream & operator (char *pSource);” 操作符操作符函数,函数,将整个字符串输出将整个字符串输出ostream对象对象输出操

8、作符输出操作符char*类型类型9.2、输入输出及其格式控制输入输出及其格式控制除了使用运算符输出,也除了使用运算符输出,也使用使用I/O流中提供的成员函流中提供的成员函数数(1) put( ): ostream的的成员函数成员函数格式格式: ostream &cout.put(char c); 或或 ostream &cout.put(const char c);9.2、输入输出及其格式控制输入输出及其格式控制#include void main()coutBEIJINGn; /使用预定义的使用预定义的插入符插入符”cout.put(B).put(E).put(I).put(

9、J).put(I).put(N).put(G).put(n); /使用类使用类ostream的方法的方法putchar c1=A,c2=B,c3=C;cout.put(c1).put(c2).put(c3 ).put(n);程序的输出结果为:程序的输出结果为: BEIJINGBEIJING BEIJING BEIJING ABC ABC9.2、输入输出及其格式控制输入输出及其格式控制(2) write(): 输出一个字符串输出一个字符串格式格式: ostream & cout.write(const char *str,int n)字符串字符串多少个字符多少个字符9.2、输入输出及其格

10、式控制输入输出及其格式控制#include #include void Print(char *s)cout.write(s,strlen(s).put(n); /使用使用ostream类的类的write方方/法实现字符串的输出,该语句意思为输出字符串法实现字符串的输出,该语句意思为输出字符串s中所有的内容中所有的内容cout.write(s,6)n; /该语句意思为输出字符串该语句意思为输出字符串s前前6个字符个字符void main()char *str=I love C+ Program!;coutThe string is : 是每个基本数据类型的友元,比如在是每个基本数据类型的友元,

11、比如在iostream.h中中 :istream& operator (char *pSource); /针对字符串针对字符串istream& operator (int source); /针对整型针对整型9.2、输入输出及其格式控制输入输出及其格式控制对于下面的语句对于下面的语句: char ch; cinch; /输入输入“x”,读入,读入x cin是是istream对象对象,是输出操作符,右面是是输出操作符,右面是char*类型,类型,故匹配上面的故匹配上面的”istream & operator (char source);” 操操作符。它将单个字符读入作符。

12、它将单个字符读入9.2、输入输出及其格式控制输入输出及其格式控制(1) get(): istream的的成员函数成员函数格式格式: int get()9.2、输入输出及其格式控制输入输出及其格式控制#includeiostream.hvoid main()char ch;coutInPut: ;while(ch=cin.get()!=EOF) /获取用户输入获取用户输入(字符字符类型类型)cout.put(ch);程序输入结果为:程序输入结果为: InPutInPut: : / /等待用户输入一个字符,然后显示等待用户输入一个字符,然后显示9.2、输入输出及其格式控制输入输出及其格式控制(2)

13、 使用使用getline()获取一行字符获取一行字符定义定义: Istream &cin.getline(char *buf , int n, deline=n)字符指针,用来存放从输入流中字符指针,用来存放从输入流中提取的字符序列,即字符串提取的字符序列,即字符串int型变量,用来限定从输入流型变量,用来限定从输入流读取的字符个数不得超过读取的字符个数不得超过n-1个个char型量,并设置型量,并设置默认参数值为默认参数值为n,用来限定一行字符用来限定一行字符的结束符的结束符结束条件有四个:结束条件有四个:1、读了、读了n-1字符字符2、碰到换行符碰到换行符 3、文件结尾文件结尾 4

14、、deline9.2、输入输出及其格式控制输入输出及其格式控制(3) 使用使用read()读取若干字符读取若干字符格式格式: cin.read(char*buf, int size);含义:含义:从输入流中读取指定数目从输入流中读取指定数目size个字符,并存放在个字符,并存放在buf中中9.2、输入输出及其格式控制输入输出及其格式控制#includeiostream.hvoid main()const int SIZE=80;char bufSIZE= ;coutInPutn;cin.read(buf,SIZE); /获取用户输入的前获取用户输入的前SIZE个字符个字符coutendl;co

15、utbufendl;程序运行结果为接受用户输入的前程序运行结果为接受用户输入的前8080个字符并显示个字符并显示9.2、输入输出及其格式控制输入输出及其格式控制3、输入输出格式控制输入输出格式控制方法方法:(1) 使用使用C中的中的printf()和和scanf()函数进行格式化函数进行格式化(2) 使用使用ios类中有关格式控制的类中有关格式控制的成员函数成员函数(3) 使用称为使用称为操纵符操纵符的特殊类型的函数的特殊类型的函数9.2、输入输出及其格式控制输入输出及其格式控制格式控制的成员函数格式控制的成员函数:参数包括:格式状态字参数包括:格式状态字 域宽、域宽、 填充字符填充字符 输出

16、精度输出精度9.2、输入输出及其格式控制输入输出及其格式控制ios类类的格式状态字(的格式状态字(15位)的定义位)的定义enum skipws = 0 x0001, /跳过输入空白跳过输入空白,可用于输入可用于输入 left = 0 x0002, /左对齐输出左对齐输出 right = 0 x0004, /右对齐输出右对齐输出 internal = 0 x0008, /在符号为和基指示符后填入字符在符号为和基指示符后填入字符 dec = 0 x0010, /转换基数为十进制转换基数为十进制 oct = 0 x0020, /转换基数为八进制转换基数为八进制 hex = 0 x0040, /转换

17、基数为十六进制转换基数为十六进制 showbase = 0 x0080, /输出时显示基指示符输出时显示基指示符 showpoint = 0 x0100, /输出时显示小数点输出时显示小数点 uppercase = 0 x0200, /十六进制输出,输出的字母为大写十六进制输出,输出的字母为大写 showpos = 0 x0400, /正整数前显示正整数前显示“”符号符号 scientific = 0 x0800, /科学计数法表示浮点数科学计数法表示浮点数 fixed = 0 x1000, /定点形式显示浮点数定点形式显示浮点数 unitbuf = 0 x2000, /输出操作后立即刷新所有

18、的流输出操作后立即刷新所有的流 stdio = 0 x4000 /输出操作后刷新输出操作后刷新stdout和和stderr9.2、输入输出及其格式控制输入输出及其格式控制用于控制输入输出格式的成员函数用于控制输入输出格式的成员函数: 函数原型函数原型功能功能long ios:setf(long flags)设置状态标志设置状态标志flagslong ios:unsetf(long flags) 清除装状态标志,并返回清除前标志清除装状态标志,并返回清除前标志long ios:flags();测试状态标志测试状态标志long ios:flags(long flags);设置标志设置标志flags

19、,并返回设置前标志,并返回设置前标志int ios:width()返回当前的宽度设置值返回当前的宽度设置值int ios:width(int w) 设置域宽设置域宽w,返回以前的设置返回以前的设置int ios:precision(int p)设置小数位数设置小数位数p,返回以前的小数位数返回以前的小数位数char ios:fill()返回当前的填充字符返回当前的填充字符char ios:fill(char ch)设置填充字符设置填充字符ch,返回当前的填充字符,返回当前的填充字符9.2、输入输出及其格式控制输入输出及其格式控制下面展示控制输入输出格式的成员函数的用法下面展示控制输入输出格式的

20、成员函数的用法:(1)设置状态标志设置状态标志将某状态标志位置将某状态标志位置“1”,使用,使用setf()函数,格式为:函数,格式为: long ios:setf(long flags)使用时,其一般的调用格式为:使用时,其一般的调用格式为: 流对象流对象.setf(ios:状态标志)状态标志);例如例如:istream isobj; /声明输入对象声明输入对象ostream osobj; /声明输出对象声明输出对象isobj.setf(ios:skipws); /跳过输入中的空白跳过输入中的空白osobj.setf(ios:left); /设置输出左对齐设置输出左对齐9.2、输入输出及其格

21、式控制输入输出及其格式控制(2)清除清除状态标志状态标志将某状态标志位清将某状态标志位清“0”,使用,使用unsetf()函数,格式为:函数,格式为: long ios:unsetf(long flags)使用时,其一般的调用格式为:使用时,其一般的调用格式为: 流对象流对象.unsetf(ios:状态标志)状态标志);例如例如:ostream osobj; /声明输出对象声明输出对象osobj.unsetf(ios:left); /清除输出左对齐清除输出左对齐9.2、输入输出及其格式控制输入输出及其格式控制(3)取取状态标志状态标志使用使用flags()函数。函数。flags ()函数有不带

22、参数与带参数两种形式函数有不带参数与带参数两种形式,格式为:格式为: long ios:flags();/返回当前的状态标志字返回当前的状态标志字 long ios:flags(long flag);/将状态字设置为将状态字设置为flag,并,并返回设置前的状态标志字返回设置前的状态标志字例如例如:ostream osobj; /声明输出对象声明输出对象osobj.flags(myflag); /flag=myflagflags(long flag)函数与函数与setf()函数的差别在于:函数的差别在于:setf()函数是函数是在原有的基础上在原有的基础上追加设定追加设定的,而的,而flags

23、()函数是用新设定函数是用新设定覆盖覆盖以以前的状态标志字前的状态标志字。 9.2、输入输出及其格式控制输入输出及其格式控制(4)设置和返回域宽设置和返回域宽域宽主要用来控制输出,在域宽主要用来控制输出,在ios类中域宽存放在数据成员类中域宽存放在数据成员int x_width中。设置域宽的成员函数有两个,其一般格式为:中。设置域宽的成员函数有两个,其一般格式为: int ios:width();/返回当前的域宽值返回当前的域宽值 int ios:width(int w);/设置域宽,并返回原来的域宽设置域宽,并返回原来的域宽例如例如:ostream osobj; /声明输出对象声明输出对象o

24、sobj.width(10);/设置域宽为设置域宽为109.2、输入输出及其格式控制输入输出及其格式控制(5)设置显示精度设置显示精度在在ios类中用数据成员类中用数据成员int x_precision来存放浮点数的输出显示来存放浮点数的输出显示精度。设置显示精度的成员函数的一般程序格式为:精度。设置显示精度的成员函数的一般程序格式为: int ios:precision(int p);此函数用来重新设置浮点数所需小数的位数,并返回设置前的此函数用来重新设置浮点数所需小数的位数,并返回设置前的小数点后的位数小数点后的位数例如例如:ostream osobj; /声明输出对象声明输出对象int

25、per=osobj.percision(4); /设置输出精度为设置输出精度为4,并返回并返回原来的精度原来的精度9.2、输入输出及其格式控制输入输出及其格式控制(6)设置填充字符设置填充字符 填充字符的作用是:当输出值不满域宽时用填充字符来填充,填充字符的作用是:当输出值不满域宽时用填充字符来填充,缺省的情况下填充字符为空格缺省的情况下填充字符为空格 在在ios类中总用数据成员类中总用数据成员x_fill来存放填充的字符。填充字符来存放填充的字符。填充字符的成员函数有两个,其一般形式为:的成员函数有两个,其一般形式为: char ios:fill()/返回当前的填充字符返回当前的填充字符 c

26、har ios:fill(char ch);/设置填充字符为设置填充字符为ch,返回设置前,返回设置前的填充字符的填充字符例如例如:ostream osobj; /声明输出对象声明输出对象osobj.fill(&); /设置填充字符为设置填充字符为&9.2、输入输出及其格式控制输入输出及其格式控制#include /流头文件流头文件void showflags (long f) /输出状态标志子函数输出状态标志子函数 long i; /用右移方法使用右移方法使i中的值为中的值为“1”的位不断右移的位不断右移for(i=0 x8000;i ; i=i1) if (i &

27、f) cout”1”;else cout”0”;coutendl;9.2、输入输出及其格式控制输入输出及其格式控制main() long f; f=cout.flags();/取当前状态标志字取当前状态标志字 showflags(f);/显示状态标志字显示状态标志字 cout.setf(ios:showpos|ios:scientific); /追加状态标志位追加状态标志位 f=cout.flags(); /获取当前的状态字存入获取当前的状态字存入f showflags(f); /调用子程序输出状态字调用子程序输出状态字 cout.unsetf(ios:scientific); /从状态字中去

28、掉从状态字中去掉seientific f=cout.flags(); /获取当前的状态字存入获取当前的状态字存入f showflags(f); /调用子程序输出状态字调用子程序输出状态字 f=cout.flags(ios:oct); /重新设置状态标志字重新设置状态标志字 showflags(f); /显示设置前的状态标志字显示设置前的状态标志字 f=cout.flags(); /取设置后的状态标志字取设置后的状态标志字 showflags(f); /显示设置后的状态标志字显示设置后的状态标志字 retrun 0;9.2、输入输出及其格式控制输入输出及其格式控制程序的运行结果为程序的运行结果为

29、:0010000000000001 0010110000000001001001000000000100000000001000000000000000100000缺省状态下的状态标志,即缺省状态下的状态标志,即skipws和和unitbuf为真为真追加追加 showpos、scientific标志标志9.2、输入输出及其格式控制输入输出及其格式控制4、操纵符格式控制操纵符格式控制使用使用ios类成员函数进行输入输出格式控制的类成员函数进行输入输出格式控制的缺点缺点:每:每个函数的调用需要写一条语句,而且不能将他们直接个函数的调用需要写一条语句,而且不能将他们直接嵌入到输入输出语句中去,嵌入到

30、输入输出语句中去,而使用操纵符函数时,操纵符被嵌入到输入或输出链而使用操纵符函数时,操纵符被嵌入到输入或输出链中,用来控制输入输出的格式中,用来控制输入输出的格式例如:例如:coutsetiosflags(ios:left)setfill($)setw(8)456endl;表明表明456在输出时左对齐,填充字符为在输出时左对齐,填充字符为$,域宽为,域宽为89.2、输入输出及其格式控制输入输出及其格式控制C+提供的预定义的操纵符有:提供的预定义的操纵符有:dec以十进制形式输入或输出整型数以十进制形式输入或输出整型数hex以十六进制形式输入或输出整型数以十六进制形式输入或输出整型数oct以八进

31、制形式输入或输出整型数以八进制形式输入或输出整型数ws用于在输入时跳过开头的空白符,仅用于输入用于在输入时跳过开头的空白符,仅用于输入endl插入一个换行符号并刷新输出流插入一个换行符号并刷新输出流ends插入一个空字符,通常用来结束一个字符串插入一个空字符,通常用来结束一个字符串flush刷新一个输出流刷新一个输出流setbase(int n)把转换基数设置为把转换基数设置为nresetiosflags(long f) 关闭由参数关闭由参数f制定的格式标志制定的格式标志setiosdlags(long f)设置由参数设置由参数f指定的格式标志指定的格式标志setfill(int c)设置填充

32、字符为设置填充字符为csetprecision(int n)设置数据小数部分的位数设置数据小数部分的位数setw(int n)设置域宽为设置域宽为n,可用于输入或输出,可用于输入或输出9.2、输入输出及其格式控制输入输出及其格式控制操纵符操纵符setiosflag()和和resetiosflags()中采用的格式中采用的格式标志有:标志有:格式标志名格式标志名含义含义ios:left输出数据按域宽左对齐输出输出数据按域宽左对齐输出ios:right输出数据按域宽右对齐输出输出数据按域宽右对齐输出ios:scientific使用科学计数法表示浮点数使用科学计数法表示浮点数ios:fixed使用定

33、点形式表示浮点数使用定点形式表示浮点数ios:dec转换基数为十进制形式转换基数为十进制形式ios:hex转换基数为十六进制形式转换基数为十六进制形式ios:oct转换基数为八进制形式转换基数为八进制形式ios:uppercase十六进制形式和科学计数法输出时,表示数值的字符一律为十六进制形式和科学计数法输出时,表示数值的字符一律为大写大写ios:showbase输出带有一个表示制式的字符(如输出带有一个表示制式的字符(如“X”表示十六进制,表示十六进制,“O”表示八进制)表示八进制)ios:showpos在正数前添加一个在正数前添加一个“”号号ios:showpoint浮点输出时必须带有一个

34、小数点浮点输出时必须带有一个小数点9.2、输入输出及其格式控制输入输出及其格式控制#include #include main() coutsetw(10)123567endl; /设定设定123输出的域宽为输出的域宽为10,567的输出取默认值的输出取默认值 coutoct123setw(10)setbase(10)456”和和“”来实现来实现(1)重载输出运算符重载输出运算符“”:输出任意类对象:输出任意类对象ostream &operator” istream &operator(class_name &ob)/操作代码操作代码return stream;注意:注

35、意: 重载输入运算符函数不能是所操作的类的成员函重载输入运算符函数不能是所操作的类的成员函数,但可以是该类的数,但可以是该类的友元函数或独立函数友元函数或独立函数。9.4、文件输入输出文件输入输出 在在C+中,将文件看成中,将文件看成字符流和二进制流字符流和二进制流,所以,所以在在C中,要进行输入输出操作,一般的过程是:中,要进行输入输出操作,一般的过程是:1、创建一个流创建一个流2、然后将这个流与文件相关联,即打开文件、然后将这个流与文件相关联,即打开文件3、进行读写操作、进行读写操作4、关闭文件、关闭文件9.4、文件输入输出文件输入输出1、创建流创建流C+为文件的输入输出提供了三种类型的流

36、,为文件的输入输出提供了三种类型的流,即输即输入流、输出流、输入输出流入流、输出流、输入输出流。建立流的过程就是定义。建立流的过程就是定义三个流类的对象。三个流类的对象。ifstream in; /建立文件输入流建立文件输入流ofstream out; /建立文件输出流建立文件输出流fstream both; /建立文件输入输出流建立文件输入输出流9.4、文件输入输出文件输入输出2、打开文件打开文件建立流以后建立流以后,要将,要将流和文件关联流和文件关联起来,这个操作就是起来,这个操作就是打开文件。使用打开文件。使用open()可以将流和文件关联起来。可以将流和文件关联起来。open()的声明

37、如下的声明如下:void open(const unsigned char *, int mode)要关联的文件名要关联的文件名 文件的打开模式文件的打开模式例如:例如:fsream out; /定义流对象定义流对象 out.open(“test”, ios:out); /打开文件打开文件)写操作写操作9.4、文件输入输出文件输入输出C+中可以使用类中可以使用类ofstream,类,类ifstream和类和类fstream中的一个来实现文件的打开操作中的一个来实现文件的打开操作:(1) 使用类使用类ifstream打开某个读文件格式如下:打开某个读文件格式如下: ifstream ifs ;

38、/定义文件流对象定义文件流对象ifs ifs.open(“a.txt”); /使用刚定义的流对象使用刚定义的流对象ifs的的/open函数打开文本文件函数打开文本文件a.txt9.4、文件输入输出文件输入输出(2) 使用类使用类ofstream打开某个写文件格式如下:打开某个写文件格式如下: ofstream ofs ; /定义文件流对象定义文件流对象ofs ofs.open(“a.txt”); /使用刚定义的流对象使用刚定义的流对象ofs的的open函函/数打开文本文件数打开文本文件a.txt9.4、文件输入输出文件输入输出(3) 使用类使用类fstream打开一个文件的格式如下:打开一个文

39、件的格式如下: (对象名对象名).open(, ); fstream fst / 定义一个文件流类定义一个文件流类fstream的对象的对象 fst.open(“a.txt”, ios:aet) /使用刚定义的流对象使用刚定义的流对象fst的的open函数打开文件函数打开文件a.txt文件打开时,文件打开时,文件指针位于文件指针位于文件尾文件尾见表见表9.79.4、文件输入输出文件输入输出3、文件读写文件读写文件打开后文件打开后,就可以使用运算符就可以使用运算符”进行读进行读写操作写操作。#include int main() ofstream fout(“test”); /打开文件打开文件

40、if(!fout) /判断打开文件是否成功判断打开文件是否成功 cout“cannot open output filen”; return 1; fout10“ ”123.456; /向文件中输入内容向文件中输入内容 fout.close(); return 0; 9.4、文件输入输出文件输入输出4、关闭文件关闭文件使用完一个文件以后,应该把它关闭。关闭文件使用使用完一个文件以后,应该把它关闭。关闭文件使用close()函数完成函数完成。 例如例如: out.close();注意注意: 进行文件操作的时侯,要养成将已完成操作的文进行文件操作的时侯,要养成将已完成操作的文件关闭的习惯,如果不关

41、闭文件,则可能丢失数据件关闭的习惯,如果不关闭文件,则可能丢失数据实例实例程序功能程序功能: 程序中定义程序中定义person类,类,Student类和类和MasterStudent类,它们之间存在着继承关系类,它们之间存在着继承关系; 自定义输出流(向文件中输出自定义输出流(向文件中输出)。)。 使用自定义的输出流将学生的信息写到文件中使用自定义的输出流将学生的信息写到文件中实现环境实现环境: Visual C +6.0,可以在,可以在Turbo/Borland C+3.0环境编译通过。环境编译通过。 程序代码有两个文件程序代码有两个文件Student.H和和Student.cpp实例实例头

42、文件:头文件:Student.H#include /C+流头文件流头文件#include /字符串操作头文件字符串操作头文件class Person /定义定义Person类类private:int age; public:Person(int a) /带参数的构造函数带参数的构造函数 age=a; /向流向流out输出输出person的信息的信息 定义为虚函数定义为虚函数virtual void display(ostream& out) /设定输出格式:左对齐,输出宽度为设定输出格式:左对齐,输出宽度为10outsetiosflags(ios:left)setw(10)age;操作

43、符操作符实例实例/Student类声明类声明class Student:public Personprivate: /定义学生类的属性定义学生类的属性char pName20; unsigned int uID;float grade;public:/构造函数构造函数Student(char *pS, unsigned num, float g, int age);/重载重载Person类中的虚函数类中的虚函数void display(ostream& out);/自定义输出流自定义输出流 定义为友元函数定义为友元函数friend ostream& operator(ostre

44、am& out, Student& st);实例实例/MasterStudent类声明类声明 公有继承公有继承class MasterStudent:public Studentpublic:/MasterStudent的构造函数的构造函数MasterStudent(char *pS,unsigned num, float g, int age,char t):Student(pS,num,g,age),type(t) /重载重载Student的虚函数的虚函数void display(ostream& out);protected:char type;实例实例:源文件:

45、源文件:Student.Cpp#include#include#includestudent.h“Student:Student(char *pS, unsigned num, float g, int age) : Person(age) strcpy(pName,pS); /将将pS所指的字符串赋给所指的字符串赋给pName uID=num; grade=g; /显示显示Student的信息的信息void Student:display(ostream& out) Person:display(out); /调用基类的成员函数调用基类的成员函数 /自定义输出格式自定义输出格式 ou

46、tsetiosflags(ios:left)setw(20)pNameuIDuID,“ setiosflags(ios:right)setw(4)grade; 实例实例:源文件:源文件:Student.Cpp/自定义输出流自定义输出流ostream& operator(ostream& out,Student& st)st.display(out); /调用本类的成员函数,调用本类的成员函数,输出数据到流输出数据到流outoutendl;return out;/输出输出MasterStudent的信息的信息/重载虚函数重载虚函数displayvoid MasterStu

47、dent:display(ostream& out)Student:display(out); /调用基类的成员调用基类的成员out“,”type; /输出派生类增加的属性值输出派生类增加的属性值实例实例:源文件:源文件:Student.Cppint main()ofstream out; /创建流创建流/打开文件打开文件out.open(c:test.txt,ios:out);/建立建立Student和和MasterStudent对象对象Student s1(张三张三,123456,98,24);MasterStudent s2(李四李四,234567,85.0,21,A);Mast

48、erStudent s3(王五王五,234568,78.0,21,B); /将对象的值输出到流将对象的值输出到流out,写到文件,写到文件/流流out和文件和文件test.txt相连相连outs1;outs2;outs3;return 0;忘了什么?忘了什么?本章小结本章小结C的的I/O是丰富、灵活和强大的,但是,是丰富、灵活和强大的,但是,C的的I/O系系统一点儿也不了解对象,不具有类型的安全性统一点儿也不了解对象,不具有类型的安全性。C+的的I/O流扬弃了流扬弃了C的的I/O系统,它操作更简洁,系统,它操作更简洁,更易理解,它使标准更易理解,它使标准I/O流、文件流和串流的操作流、文件流和

49、串流的操作在概念上统一了起来。有了控制符,在概念上统一了起来。有了控制符,C+更加灵更加灵活,由它所重载的插入运算符完全融入了活,由它所重载的插入运算符完全融入了C+的的类及其继承的体系类及其继承的体系综合训练综合训练题目题目:设计一个管理图书目的简单程序,提供:设计一个管理图书目的简单程序,提供的基本功能的基本功能:(1)可连续将新书可连续将新书存入存入文件文件“book.dat”中,中,新书信息加入到文件的尾部;新书信息加入到文件的尾部;(2)也可以根据输入的书名进行也可以根据输入的书名进行查找查找,把文件,把文件“book.dat”中同书名的所有书显示出来。中同书名的所有书显示出来。为简单起见,描述一本书的信息包括:为简单起见,描述一本书的信息包括:书号,书号,书名,出版社和作者书名,出版社和作者。综合训练综合训练分析:分析:可以把描述一本书的信息定义为一个可以把描述一本书的信息定义为一个Book类,它包类,它包含必要的成员函数。含必要的成员函数。把加入的新书总是加

温馨提示

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

评论

0/150

提交评论