面向对象程序设计07-1.输入输出流对象_第1页
面向对象程序设计07-1.输入输出流对象_第2页
面向对象程序设计07-1.输入输出流对象_第3页
面向对象程序设计07-1.输入输出流对象_第4页
面向对象程序设计07-1.输入输出流对象_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

1、七、输入七、输入/ /输出流对象输出流对象n螺旋矩阵的输入输出问题螺旋矩阵的输入输出问题 n流流n无格式输入无格式输入/ /输出输出n输入输入/ /输出的格式控制输出的格式控制n自定义类型对象的输入输出自定义类型对象的输入输出n文件的输入文件的输入/ /输出问题输出问题第7章输入/输出流对象2022-2-233n编程输出编程输出M M* *M M的螺旋矩阵,要求数据间距与的螺旋矩阵,要求数据间距与M M相同相同。例如,。例如,4 4* *4 4的螺旋矩阵,其间距为的螺旋矩阵,其间距为4:4: 1 2 3 41 2 3 4 12 13 14 5 12 13 14 5 11 16 15 6 11

2、16 15 6 10 9 8 7 10 9 8 7第7章输入/输出流对象2022-2-234nC+C+没有定义任何用于执行输入或输出的语句,没有定义任何用于执行输入或输出的语句,但可以使用但可以使用C C语言中的标准语言中的标准I/OI/O函数函数printf()printf()和和scanf()scanf()来解决此问题。来解决此问题。第7章输入/输出流对象2022-2-235【例】有如下程序:【例】有如下程序:#include #include int b=20;int b=20;float a=5.6;float a=5.6;int main()int main() printf(%dn

3、,a); printf(%dn,a); scanf(%d,&a); scanf(%d,&a); scanf(%d,&b); scanf(%d,&b); printf(%dn,abc); printf(%dn,abc); return 0; return 0; 该程序的运行结果为:该程序的运行结果为:161061273623 45 4349980第7章输入/输出流对象2022-2-236nprintf()printf()与与scanf()scanf()存在以下两个缺点:存在以下两个缺点:1 1非类型安全非类型安全2 2不可扩充性不可扩充性class Aclass

4、AA a;A a;printf(%?,a); /printf(%?,a); /不知用什么格式符来识别不知用什么格式符来识别A A的对象的对象第7章输入/输出流对象2022-2-237nC+C+用用I/OI/O流来解决这个问题。流来解决这个问题。n下面先介绍流的概念。下面先介绍流的概念。第7章输入/输出流对象2022-2-238n在在C+C+程序中,数据可以从外部设备程序中,数据可以从外部设备( (键盘等键盘等) )流流入到计算机内存中,也可以从计算机内存流向外入到计算机内存中,也可以从计算机内存流向外部设备部设备( (屏幕或磁盘文件等屏幕或磁盘文件等) ),这种数据传递被称,这种数据传递被称作

5、输入输出。作输入输出。nC+C+将数据从一个位置到另一个位置的传递抽象将数据从一个位置到另一个位置的传递抽象为流。所谓流为流。所谓流(stream)(stream)就是指数据从一个位置流就是指数据从一个位置流向另一个位置。向另一个位置。流是字节的序列流是字节的序列。nC+C+的输入输出操作是基于流来处理的。的输入输出操作是基于流来处理的。第7章输入/输出流对象2022-2-239nC+C+基于流的概念处理数据的输入输出,因此也基于流的概念处理数据的输入输出,因此也称之为输入输出流,即称之为输入输出流,即I/OI/O流。流。nI/OI/O流具有两个基本的行为特征,一是从流中获流具有两个基本的行为

6、特征,一是从流中获取数据的操作称为取数据的操作称为提取操作提取操作,二是向流中添加数,二是向流中添加数据的操作称为据的操作称为插入操作插入操作。第7章输入/输出流对象2022-2-2310nC+C+标准库围绕流的概念,提供了一整套标准库围绕流的概念,提供了一整套I/OI/O流类流类簇,既可用于标准类型数据的簇,既可用于标准类型数据的I/OI/O,也能用于自,也能用于自定义类型对象的定义类型对象的I/OI/O,这种扩展性是,这种扩展性是C+C+最有价值最有价值的特点之一。的特点之一。nC+C+标准库提供的标准库提供的I/OI/O流类的各种操作都是类型安流类的各种操作都是类型安全全(type sa

7、fe)(type safe)的。不同类型的的。不同类型的I/OI/O流操作都是重流操作都是重载的,没有定义过载的,没有定义过I/OI/O功能的类型不具备功能的类型不具备I/OI/O操作操作的能力。的能力。第7章输入/输出流对象2022-2-2311nC+C+标准库提供的标准库提供的I/OI/O流类簇有两个平行基类:流类簇有两个平行基类:nstreambuf(filebufstreambuf(filebuf,stringbufstringbuf,strstreambuf)strstreambuf)nios(istreamios(istream,ostream)ostream)niosios类有下

8、面直接派生类类有下面直接派生类: :n输入流类输入流类istreamistream(ifstream(ifstream,istringstreamistringstream,istrstream)istrstream)n输出流类输出流类ostreamostream(ofstream(ofstream,ostringstreamostringstream,ostrstream)ostrstream)(iostream-fstream(iostream-fstream,stringstreamstringstream,strstream)strstream)第7章输入/输出流对象2022-2-23

9、12nC+C+标准库提供的标准库提供的I/OI/O流按功能可分为如下流按功能可分为如下3 3类:类:n标准标准I/OI/O流:内存与标准输入输出设备流:内存与标准输入输出设备( (键盘、屏键盘、屏幕幕) )之间数据的传递;之间数据的传递;n文件文件I/OI/O流:内存与外部磁盘文件之间数据的传流:内存与外部磁盘文件之间数据的传递;递;n字符串字符串I/OI/O流:内存变量与表示字符串流的字符流:内存变量与表示字符串流的字符数组之间数据的传递。数组之间数据的传递。 第7章输入/输出流对象2022-2-2313n标准标准I/OI/O流预定义了流预定义了4 4个流类对象:个流类对象:cincin、c

10、outcout、cerrcerr、clogclog。n操作系统给把外设用文件名的方式进行管理,因操作系统给把外设用文件名的方式进行管理,因此程序设计要访问外设就跟访问文件一样方便。此程序设计要访问外设就跟访问文件一样方便。 第7章输入/输出流对象2022-2-2314nI/OI/O分为无格式支持的低级分为无格式支持的低级I/OI/O和具有格式支持的和具有格式支持的高级高级I/OI/O。n无格式支持的低级无格式支持的低级I/OI/O以基本字节为操作对象,以基本字节为操作对象,有格式支持的高级有格式支持的高级I/OI/O把若干字节组合成有意义把若干字节组合成有意义的单位,如整数、浮点数、字符、字符

11、串及用户的单位,如整数、浮点数、字符、字符串及用户自定义类型等等。自定义类型等等。第7章输入/输出流对象2022-2-2315n无格式输入无格式输入/ /输出就是按系统预定义的格式进行输出就是按系统预定义的格式进行的输入的输入/ /输出。输出。n按默认约定,每个按默认约定,每个C+C+程序都能使用标准程序都能使用标准I/OI/O流,流,如标准输入、标准输出。如标准输入、标准输出。ncincin用来处理标准输入,即键盘输入;用来处理标准输入,即键盘输入;coutcout用来处理用来处理标准输出,即屏幕输出。它们被定义在标准输出,即屏幕输出。它们被定义在iostreamiostream头头文件中。

12、文件中。n在使用在使用coutcout和和cincin前,要用编译预处理命令将所使用前,要用编译预处理命令将所使用的头文件包含到源程序中,其格式如下:的头文件包含到源程序中,其格式如下:#include #include 第7章输入/输出流对象2022-2-2316n“”“”是预定义的插入运算符,作用在流类对象是预定义的插入运算符,作用在流类对象coutcout上,实现默认格式的屏幕输出。使用上,实现默认格式的屏幕输出。使用coutcout输输出表达式值到屏幕上的格式如下:出表达式值到屏幕上的格式如下:coutE1E2Em;coutE1E2Em;其中,其中,E1E1、E2E2、EmEm为均为表

13、达式。功能是计为均为表达式。功能是计算各表达式的值,并将结果输出到屏幕当前光标算各表达式的值,并将结果输出到屏幕当前光标位置处。位置处。第7章输入/输出流对象2022-2-2317ncoutcout是是ostreamostream流类的对象,它在流类的对象,它在iostreamiostream头文头文件中作为全局对象定义,其格式如下:件中作为全局对象定义,其格式如下:ostream cout(stdout);ostream cout(stdout);其中,其中,stdoutstdout表示标准输出设备名(屏幕)。表示标准输出设备名(屏幕)。n在在ostreamostream流类中,对应每个基本

14、数据类型定义流类中,对应每个基本数据类型定义运算符运算符“”重载函数为友元,它们在重载函数为友元,它们在ostreamostream中声明:中声明: ostream& operator(ostream&dest,charostream& operator(ostream&dest,char* * pSource);pSource); ostream& operator(ostream& dest,int source); ostream& operator(ostream& dest,int source); ostream&am

15、p; operator(ostream& dest,char source); ostream& operator”“”是预定义的提取运算符,作用在流类对象是预定义的提取运算符,作用在流类对象cincin上,实现默认格式的键盘输入。使用上,实现默认格式的键盘输入。使用cincin将数将数据输入到变量的格式如下:据输入到变量的格式如下:cinV1V2Vn;cinV1V2Vn; 其中,其中,V1V1、V2V2、VnVn都是变量。功能是暂停执都是变量。功能是暂停执行程序,等待用户从键盘输入数据,各数据间用行程序,等待用户从键盘输入数据,各数据间用空格或空格或TabTab键分隔,输入数

16、据类型要与接受变量键分隔,输入数据类型要与接受变量类型一致,输完后,按回车键结束。类型一致,输完后,按回车键结束。第7章输入/输出流对象2022-2-2319ncincin是是istreamistream流类的对象,它在流类的对象,它在iostreamiostream头文件头文件中作为全局对象定义,其格式如下:中作为全局对象定义,其格式如下:istream cin(stdin);istream cin(stdin);n在在istreamistream流类中,对应每个基本数据类型定义流类中,对应每个基本数据类型定义运算符运算符“”重载函数为友元,它们在重载函数为友元,它们在istreamistr

17、eam中声明:中声明:istream &operator(istream &sour,char istream &operator(istream &sour,char * *pDes);pDes);istream &operator(istream &sour,int des);istream &operator(istream &sour,int des);istream &operator(istream &sour,char des);istream &operator(istream &s

18、our,char des);第7章输入/输出流对象2022-2-2320nC+C+提供了两种格式化输入提供了两种格式化输入/ /输出方式输出方式: :n一种是用一种是用iosios类成员函数进行格式化输入输出类成员函数进行格式化输入输出n另一种是用专门的操作符函数进行格式化输入输出另一种是用专门的操作符函数进行格式化输入输出第7章输入/输出流对象2022-2-2321niosios类成员函数主要是通过对状态标志、输出宽类成员函数主要是通过对状态标志、输出宽度、填充字符以及输出精度的操作来完成输入度、填充字符以及输出精度的操作来完成输入/ /输出格式化。输出格式化。n输入输出格式由各种状态标志来

19、确定,这些状态输入输出格式由各种状态标志来确定,这些状态标志在标志在iosios类中定义为枚举量。类中定义为枚举量。n由于该枚举量定义在由于该枚举量定义在iosios类中,因此引用时必须类中,因此引用时必须包含包含ios:ios:前缀。使用时应该全部用符号名,绝前缀。使用时应该全部用符号名,绝不要用数值。不要用数值。第7章输入/输出流对象2022-2-2322enumenum skipws = 0 x0001 ,skipws = 0 x0001 ,/跳过输入空格跳过输入空格left = 0 x0002 ,left = 0 x0002 ,/按左对齐格式输出按左对齐格式输出right = 0 x0

20、004 ,right = 0 x0004 ,/按右对齐格式输出按右对齐格式输出internal = 0 x0008 ,internal = 0 x0008 ,/输出符号和基指示符后的填补输出符号和基指示符后的填补dec = 0 x0010 ,dec = 0 x0010 ,/转换为十进制转换为十进制(In / Out)(In / Out)oct = 0 x0020 ,oct = 0 x0020 ,/转换为八进制转换为八进制(In / Out)(In / Out)hex = 0 x0040 ,hex = 0 x0040 ,/转换为十六进制转换为十六进制(In / Out)(In / Out)sho

21、wbase = 0 x0080 ,showbase = 0 x0080 ,/输出显示基指示符输出显示基指示符showpoint = 0 x0100 ,showpoint = 0 x0100 ,/输出显示小数点输出显示小数点uppercase = 0 x0200 ,uppercase = 0 x0200 ,/大写十六进制输出大写十六进制输出showpos = 0 x0400 ,showpos = 0 x0400 ,/正整数显示前加上正整数显示前加上“”scientific = 0 x0800 ,scientific = 0 x0800 , /输出用科学表示法表示的浮点数输出用科学表示法表示的浮点

22、数fixed = 0 x1000 ,fixed = 0 x1000 ,/输出用固定小数点表示的浮点数输出用固定小数点表示的浮点数unitbuf = 0 x2000 ,unitbuf = 0 x2000 ,/在输出操作后刷新所有流在输出操作后刷新所有流stdio = 0 x4000stdio = 0 x4000/在输出操作后刷新在输出操作后刷新stdoutstdout和和stderrstderr n这些标志可以由这些标志可以由iosios类成员函数访问,也可以用类成员函数访问,也可以用操作符函数访问。操作符函数访问。第7章输入/输出流对象2022-2-2323niosios类有类有3 3个成员函

23、数可以对状态标志进行操作,个成员函数可以对状态标志进行操作,分别为分别为flags()flags()、setf()setf()和和unsetf()unsetf(),并且,并且iosios类类还定义了一个还定义了一个longlong型数据成员记录当前状态标志型数据成员记录当前状态标志。这些状态标志可用位或运算符。这些状态标志可用位或运算符“| |”进行组合进行组合。n用用setfsetf函数设置状态标志,其一般格式如下:函数设置状态标志,其一般格式如下:long ios:long ios:setfsetf(long flags)(long flags)第7章输入/输出流对象2022-2-2324

24、n用用unsetfunsetf函数清除状态标志,其一般格式如下:函数清除状态标志,其一般格式如下:long ios:unsetf(long flags)long ios:unsetf(long flags)n用函数用函数flagsflags取状态标志有两种形式,其一般格取状态标志有两种形式,其一般格式分别如下:式分别如下:long ios:flags() long ios:flags() long ios:flags(long flag)long ios:flags(long flag)第一种形式返回与流相关的当前状态标志值;第第一种形式返回与流相关的当前状态标志值;第二种形式将流的状态标志值

25、设置为二种形式将流的状态标志值设置为flagflag,并返回,并返回设置前的状态标志值。设置前的状态标志值。第7章输入/输出流对象2022-2-2325n例例 使用使用iosios成员函数操作状态字成员函数操作状态字void showflags(long f);void showflags(long f);void main()void main() long f;long f;f=cout.flags(); /f=cout.flags(); /取当前状态标志取当前状态标志showflags(f); /showflags(f); /显示状态值显示状态值cout.setf(ios:showpos

26、|ios:scientific|ios:fixed);cout.setf(ios:showpos|ios:scientific|ios:fixed); / /追加状态标志追加状态标志f=cout.flags(); /f=cout.flags(); /取当前状态标志取当前状态标志showflags(f); /showflags(f); /显示状态值显示状态值cout.unsetf(ios:scientific); /cout.unsetf(ios:scientific); /从状态标志中去掉标志从状态标志中去掉标志f=cout.flags(); /f=cout.flags(); /取当前状态标志

27、取当前状态标志showflags(f); /showflags(f); /显示状态值显示状态值f=cout.flags(ios:hex); /f=cout.flags(ios:hex); /重新设置状态标志重新设置状态标志showflags(f);showflags(f);f=cout.flags(); /f=cout.flags(); /取当前状态标志取当前状态标志showflags(f);showflags(f); 第7章输入/输出流对象2022-2-2326n设置输出宽度函数有两种形式,其一般格式分设置输出宽度函数有两种形式,其一般格式分别如下:别如下:int ios:int ios:w

28、idthwidth(int len)(int len)int ios:int ios:widthwidth()()第一种形式是设置输出宽度,并返回原来的输第一种形式是设置输出宽度,并返回原来的输出宽度;第二种形式是返回当前输出宽度,输出宽度;第二种形式是返回当前输出宽度,输出宽度为出宽度为0。第7章输入/输出流对象2022-2-2327n 例例 使用使用widthwidth控制输出宽度控制输出宽度#include #include using namesoace std;using namesoace std;int main() int main() double values = 1.23

29、,35.36,653.7,4358.24;double values = 1.23,35.36,653.7,4358.24; for(int i=0;i4;i+) for(int i=0;i4;i+) cout.width(10); cout.width(10); cout valuesi n; cout valuesi n; 输出结果输出结果: : 1.23 1.23 35.36 35.36 653.7 653.7 4358.24 4358.24第7章输入/输出流对象2022-2-2328n填充字符的作用是当输出值不满输出宽度时用填充字符的作用是当输出值不满输出宽度时用填充字符来填充,默认填

30、充字符为空格。它与填充字符来填充,默认填充字符为空格。它与width()width()函数配合使用,否则没有意义。函数配合使用,否则没有意义。n设置填充字符函数有两种形式,其格式分别如设置填充字符函数有两种形式,其格式分别如下:下:char ios:char ios:fillfill(char ch)(char ch)char ios:char ios:fillfill()()第一种形式是重新设置填充字符,并返回设置第一种形式是重新设置填充字符,并返回设置前的填充字符;第二种形式是返回当前的填充前的填充字符;第二种形式是返回当前的填充字符。字符。第7章输入/输出流对象2022-2-2329n

31、例例 使用使用fillfill设置填充字符设置填充字符#include #include using namesoace std;using namesoace std;int main() int main() double values = 1.23,35.36,653.7,4358.24;double values = 1.23,35.36,653.7,4358.24; for(int i=0;i4;i+) for(int i=0;i4;i+) cout.width(10); cout.width(10); cout.fill( cout.fill(* *);); cout values

32、i n; cout valuesi n; 输出结果:输出结果:* * * * * * *1.231.23* * * * * *35.3635.36* * * * * *653.7653.7* * * *4358.244358.24第7章输入/输出流对象2022-2-2330n设置浮点数输出精度有两种形式,其格式分别设置浮点数输出精度有两种形式,其格式分别如下:如下:int ios:int ios:precisionprecision(int p)(int p)int ios:int ios:precisionprecision()()第一种形式是重新设置输出精度,并返回设置第一种形式是重新设置

33、输出精度,并返回设置前的输出精度;第二种形式是返回当前的输出前的输出精度;第二种形式是返回当前的输出精度。精度。第7章输入/输出流对象2022-2-2331n例例 使用使用precisionprecision设置填充字符设置填充字符#include #include using namesoace std;using namesoace std;int main() int main() int j;int j;j=cout.precision();j=cout.precision();coutpresicion:jendl;coutpresicion:jendl;cout.precision

34、(8);cout.precision(8);cout123.456789endl;cout123.456789endl;coutpresicion:cout.precision()endl;coutpresicion:cout.precision()”或插入运算符或插入运算符“”后面来设定输入后面来设定输入/ /输出格式输出格式,即在读写对,即在读写对象之间插入一个修改状态的操作。象之间插入一个修改状态的操作。n其中有些函数没有参数,所以又叫其中有些函数没有参数,所以又叫操作符操作符。 第7章输入/输出流对象2022-2-2333n设置输入设置输入/输出宽度函数输出宽度函数setw(int)s

35、etw(int)n设置输出填充字符函数设置输出填充字符函数setfill(int) setfill(int) n设置输出精度函数设置输出精度函数setprecision(int)setprecision(int)n设置输入设置输入/输出整型数数制函数输出整型数数制函数decdec、hexhex和和octoct n取消输入结束符函数取消输入结束符函数wsws n控制换行操作符控制换行操作符endl endl n代表输出单字符代表输出单字符“0”的操作符的操作符endsends第7章输入/输出流对象2022-2-2334n 例例 使用使用setwsetw设置输入设置输入/ /输出宽度输出宽度#in

36、clude #include #include #include using namesoace std;using namesoace std;int main() int main() char char * *p=12345,p=12345,* *q=678;q=678;char f4,g4; /char f4,g4; /最后一位为最后一位为00int i=10;int i=10;coutpsetw(6)qsetw(4)pqendl;/coutpsetw(6)qsetw(4)pqsetw(4)fg; /cinsetw(4)fg; /设置输入宽度设置输入宽度coutfendlgendli:

37、iendl; coutfendlgendli:iendl; return 0;return 0; 运行结果:运行结果:12345 6781234567812345 6781234567812345123451231234545i:10i:10第7章输入/输出流对象2022-2-2335n 例例 分别用浮点、定点的方式表示一个实数分别用浮点、定点的方式表示一个实数#include #include #include #include using namesoace std;using namesoace std;int main() int main() double f=22.0/7;doub

38、le f=22.0/7;/在用浮点表示的输出中,在用浮点表示的输出中,setprecision(n)setprecision(n)表示实数有效位数表示实数有效位数coutfendl; /coutfendl; /默认有效位数为默认有效位数为6 6coutsetprecision(3)fendl; /coutsetprecision(3)fendl; /最小的有效位数为最小的有效位数为3 3/在用定点表示的输出中,在用定点表示的输出中,setprecision(n)setprecision(n)表示小数有效位数表示小数有效位数coutsetiosflags(ios:fixed); coutseti

39、osflags(ios:fixed); coutsetprecision(8)fendl; /coutsetprecision(8)fendl; /小数位数为小数位数为8 8return 0;return 0; 运行结果:运行结果:3.142863.142863.143.143.142857143.14285714第7章输入/输出流对象2022-2-2336n例例 使用使用decdec、hexhex、octoct设置输出整型数制设置输出整型数制#include #include #include #include using namesoace std;using namesoace std;

40、int main() int main() int number=1001; int number=1001; coutDecimal:decnumberendlcoutDecimal:decnumberendl Hexadecimal:hexnumberendl Hexadecimal:hexnumberendl Octal:octnumberendl; Octal:octnumberendl;return 0;return 0; 运行结果:运行结果:Decimal:1001Decimal:1001Hexadecimal:3E9Hexadecimal:3E9Ocatl:1751Ocatl:1

41、751第7章输入/输出流对象2022-2-2337nc+c+提供了标准的操作符函数,也提供了建立自提供了标准的操作符函数,也提供了建立自定义操作符函数的方法。定义操作符函数的方法。n建立输出操作符函数的格式如下:建立输出操作符函数的格式如下:ostream & manip_name(ostream& stream)ostream & manip_name(ostream& stream) return stream;return stream; n其中其中manip_namemanip_name是自定义操作符函数的名字。是自定义操作符函数的名字。第7章输入/输出

42、流对象2022-2-2338n例例 用户自定义输出操作符函数用户自定义输出操作符函数#include #include #include #include using namesoace std;using namesoace std;ostream& setup(ostream& stream)ostream& setup(ostream& stream) stream.setf(ios:left);stream.setf(ios:left);streamsetw(10)setfill($);streamsetw(10)setfill($);return st

43、ream;return stream; int main() int main() cout10 setup10endl;cout10 setup10endl;return 0;return 0; 运行结果:运行结果:10 10&10 10&第7章输入/输出流对象2022-2-2339n建立输入操作符函数的格式如下:建立输入操作符函数的格式如下:istream & manip_name(istream& stream)istream & manip_name(istream& stream) return stream;return stream

44、; n其中其中manip_namemanip_name是自定义操作符函数的名字。是自定义操作符函数的名字。第7章输入/输出流对象2022-2-2340n 例例 用户自定义输出操作符函数用户自定义输出操作符函数#include #include #include #include using namesoace std;using namesoace std;istream& prompt(istream& stream)istream& prompt(istream& stream) cinhex; cinhex; coutEnter number using

45、hex format coutprompti;cinprompti;coutiendl;coutiendl;return 0;return 0; 运行结果:运行结果:Enter number using hex formatEnter number using hex format:ffff 255第7章输入/输出流对象2022-2-2341n上面都是对基本类型数据进行输入上面都是对基本类型数据进行输入/ /输出操作,输出操作,实际上,实际上,C+C+允许对自定义类型对象进行同样简允许对自定义类型对象进行同样简单语法的输入单语法的输入/ /输出。输出。n示例示例 自定义类型对象的输入自定义类型

46、对象的输入/ /输出输出第7章输入/输出流对象2022-2-2342class Dateclass Date public: public: Date(int y,int m,int d) Year=y;Month=m;Day=d;Date(int y,int m,int d) Year=y;Month=m;Day=d;friend ostream& operator(ostream &stream,Date &date);friend ostream& operator(istream &stream,Date &date);friend is

47、tream& operator(istream &stream,Date &date);private:private:int Year,Month,Day;int Year,Month,Day;ostream& operator(ostream &stream,Date &date)ostream& operator(ostream &stream,Date &date) streamdate.Year/date.Month/date.Dayendl; streamdate.Year/date.Month/date.Da

48、y(istream &stream,Date &date)istream& operator(istream &stream,Date &date) streamdate.Yeardate.Monthdate.Day;streamdate.Yeardate.Monthdate.Day;return stream;return stream; 第7章输入/输出流对象2022-2-2343int main()int main() Date date(2005,11,28);Date date(2005,11,28);coutCurrent date:date

49、endl;coutCurrent date:dateendl;coutEnter new date:;coutdate;cindate;coutNew date:dateendl;coutNew date:dateendl;return 0return 0; 输出结果为:输出结果为:Current date:2005/11/28Current date:2005/11/28Enter new date:Enter new date:2007 12 92007 12 9New date:2007/12/9New date:2007/12/9第7章输入/输出流对象2022-2-2344n如何对文本

50、文件和二进制文件进行输入和输出操如何对文本文件和二进制文件进行输入和输出操作?作?第7章输入/输出流对象2022-2-2345n文件一般指的是磁盘文件,它是存储在磁盘上的文件一般指的是磁盘文件,它是存储在磁盘上的相关数据集合。每个文件都有确定的名字。相关数据集合。每个文件都有确定的名字。n需要长久保存并能够被重新读写的信息,将它保需要长久保存并能够被重新读写的信息,将它保存在外存文件上。存在外存文件上。nC+C+常用的文件有程序文件,数据文件以及设备常用的文件有程序文件,数据文件以及设备文件。键盘作为标准输入文件,显示器作为标准文件。键盘作为标准输入文件,显示器作为标准输出文件。输出文件。nC

51、+C+标准库提供了相关的文件操作。对需要输入标准库提供了相关的文件操作。对需要输入的大批量数据,可以事先以文件的形式存放在磁的大批量数据,可以事先以文件的形式存放在磁盘上,在程序中,从指定的文件中读取数据;程盘上,在程序中,从指定的文件中读取数据;程序的运行结果也可以写入磁盘上指定的文件,使序的运行结果也可以写入磁盘上指定的文件,使用时再将文件中的数据读入。用时再将文件中的数据读入。第7章输入/输出流对象2022-2-2346nC+C+把文件看作是一个字符(字节)的序列,即把文件看作是一个字符(字节)的序列,即由一个个字符(字节)数据顺序组成。由一个个字符(字节)数据顺序组成。n文件按存储格式

52、分二类:一种为字符格式文件,文件按存储格式分二类:一种为字符格式文件,简称字符文件简称字符文件(ASCII(ASCII码文件或文本文件码文件或文本文件) ),另一,另一种为内部格式文件,简称字节文件种为内部格式文件,简称字节文件( (二进制文件二进制文件) )n字符文件中,每一个字节单元的内容存放一个字字符文件中,每一个字节单元的内容存放一个字符的符的ASCIIASCII码,能够直接被显示和打印。码,能够直接被显示和打印。n字节文件中,是把内存中的数据按其在内存中的字节文件中,是把内存中的数据按其在内存中的存储形式原样输出到磁盘文件存放。存储形式原样输出到磁盘文件存放。 第7章输入/输出流对象

53、2022-2-2347nASCIIASCII码文件占用字节多,把内存中的数据写入码文件占用字节多,把内存中的数据写入ASCIIASCII码文件或从码文件或从ASCIIASCII码文件读数据存放在内存码文件读数据存放在内存中,需要转换。中,需要转换。n二进制文件占用字节少,把内存中的数据写入二二进制文件占用字节少,把内存中的数据写入二进制文件或从二进制文件读数据存放在内存中,进制文件或从二进制文件读数据存放在内存中,不需要转换。不需要转换。例如:例如:1000010000是整型数据,用二进制表示占两或是整型数据,用二进制表示占两或四个字节,如用四个字节,如用ASCIIASCII码表示,则占五个字

54、节。码表示,则占五个字节。n对于字符信息,在字符文件和字节文件中保存的对于字符信息,在字符文件和字节文件中保存的信息是相同的。信息是相同的。n对于数值信息,在字符文件和字节文件中保存的对于数值信息,在字符文件和字节文件中保存的信息是不同的。信息是不同的。第7章输入/输出流对象2022-2-2348n要在程序中使用文件,首先应在文件开始包含头要在程序中使用文件,首先应在文件开始包含头文件:文件:#include #include n在访问文件之前,用头文件在访问文件之前,用头文件fstreamfstream中提供的输中提供的输入文件流类入文件流类ifstreamifstream、输出文件流类、输

55、出文件流类ofstreamofstream或或输入输出文件流类输入输出文件流类fstreamfstream定义一个文件流类的定义一个文件流类的对象,然后用该对象调用相应类中的对象,然后用该对象调用相应类中的openopen成员函成员函数,按照一定的打开方式打开一个文件。数,按照一定的打开方式打开一个文件。n文件被打开后,就可以通过文件流对象访问它。文件被打开后,就可以通过文件流对象访问它。n文件访问结束后,再通过流对象关闭它,释放缓文件访问结束后,再通过流对象关闭它,释放缓冲区。冲区。第7章输入/输出流对象2022-2-2349n为文件为文件定义定义一个流类对象;一个流类对象;n使用使用ope

56、n()open()函数建立(或打开)文件。如果文件函数建立(或打开)文件。如果文件不存在,则建立该文件;如果磁盘上已存在该文不存在,则建立该文件;如果磁盘上已存在该文件,则打开该文件;件,则打开该文件;n进行进行读写读写操作。在建立(或打开)的文件上执行操作。在建立(或打开)的文件上执行所要求的输入所要求的输入/输出操作。一般来说,在内存与输出操作。一般来说,在内存与外设的数据传输中,由内存到外设称为输出或写外设的数据传输中,由内存到外设称为输出或写,反之则称为输入或读;,反之则称为输入或读;n使用使用close()close()函数关闭文件。当完成操作后,应函数关闭文件。当完成操作后,应把打

57、开的文件关闭,避免误操作。把打开的文件关闭,避免误操作。第7章输入/输出流对象2022-2-2350n每个文件流类都有一个每个文件流类都有一个openopen成员函数,并且具有成员函数,并且具有完全相同的声明格式,具体声明格式为:完全相同的声明格式,具体声明格式为:void open(const char * fname, int mode, int access);其中,其中,fname指向要打开文件的文件名字符串,指向要打开文件的文件名字符串,mode指定打开文件的方式,对应的实参是指定打开文件的方式,对应的实参是iosios类类中定义的中定义的open_mode枚举类型中的枚举常量,枚举

58、类型中的枚举常量,或由这些枚举常量构成的按位或表达式,或由这些枚举常量构成的按位或表达式,access指定文件的访问方式。指定文件的访问方式。n在在C+C+中,打开一个文件就是将这个文件与对应中,打开一个文件就是将这个文件与对应流对象建立关联;流对象建立关联;第7章输入/输出流对象2022-2-2351第7章输入/输出流对象2022-2-2352n 定义文件流对象和打开文件举例:定义文件流对象和打开文件举例:1)ofstream fout;1)ofstream fout;fout.open(“a:data1.dat”);fout.open(“a:data1.dat”);2)ifstream f

59、in;2)ifstream fin; fin.open(“a:data1.dat”,ios:in|ios:nocreatfin.open(“a:data1.dat”,ios:in|ios:nocreat););3)ofstream ofs;3)ofstream ofs; ofs.open(“a:data1.dat”, ios:app); ofs.open(“a:data1.dat”, ios:app);4)fstream fio;4)fstream fio; fio.open(“a:data1.dat”,ios:out|ios:binaryfio.open(“a:data1.dat”,ios:

60、out|ios:binary););第7章输入/输出流对象2022-2-2353n每个文件流类中都提供有一个关闭文件的成员函每个文件流类中都提供有一个关闭文件的成员函数数closeclose,当打开的文件操作结束后,就需要关,当打开的文件操作结束后,就需要关闭它,使文件流与对应的物理文件断开联系。闭它,使文件流与对应的物理文件断开联系。n关闭任何一个流对象所对应的文件,就是用这个关闭任何一个流对象所对应的文件,就是用这个流对象调用流对象调用closeclose成员函数。成员函数。n文件流对应的文件被关闭后,还可以利用该文件文件流对应的文件被关闭后,还可以利用该文件流调用流调用openopen成员函数打开其他的文件。成员函数打开其他的文件。ofstream fout;fout.open(“a:data1.dat”);fout.close();第7章输入/输出流对象2022-2-2354n文件指针文件指针对于每个打开的文件,都存在着一个文件指针,对于每个打开的文件,都存在着一个文件指针,初始指向一个隐含的位置,该位置由具体打开方初始指向一个隐含的位置,该位置由具体打开方式决定。式决定。对文件的读写都是从当前文件指针所指的位置开对文件的读写都是从当前文件指针所指的位置开始,

温馨提示

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

评论

0/150

提交评论