C++课件第10章流类库与输入输出

上传人:E**** 文档编号:90579174 上传时间:2019-06-13 格式:PPT 页数:61 大小:384KB
返回 下载 相关 举报
C++课件第10章流类库与输入输出_第1页
第1页 / 共61页
C++课件第10章流类库与输入输出_第2页
第2页 / 共61页
C++课件第10章流类库与输入输出_第3页
第3页 / 共61页
C++课件第10章流类库与输入输出_第4页
第4页 / 共61页
C++课件第10章流类库与输入输出_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《C++课件第10章流类库与输入输出》由会员分享,可在线阅读,更多相关《C++课件第10章流类库与输入输出(61页珍藏版)》请在金锄头文库上搜索。

1、1,第10章 流类库与输入输出,10.1 流、文件以及C+的基本流类和文件流类系统 *10.2 插入与提取运算符的重载 10.3 对输入输出格式进行控制 10.4 使用预定义的插入与提取运算符对文件流进行读写操作 10.5 使用类成员函数对文件流进行操作 10.6 text文件与binary文件 10.7 对数据文件进行随机访问,2,10.1 流、文件以及C+的基本流类和文件流类系统 - 参看书p232-234, 10.2与10.3节,C+语言中的输入输出操作(功能)是由它所预定义的诸I/O流类的一个类库所提供的。 1. 流(Stream) 流(stream)是一个逻辑概念,它是C+语言对所有

2、外部设备的逻辑抽象,它代表的是某种流类类型的一个对象。C+的IO系统将每个外部设备都转换成一个称为流的逻辑设备,由流来完成对不同设备的具体操作。,3,2. 文件(File),文件(File)是一个物理概念,代表存储着信息集合的某个外部介质,它是C+语言对具体设备的抽象。如,磁盘文件,显示器,键盘。 所有流(类对象)的行为都是相同的,而不同的文件则可能具有不同的行为。如,磁盘文件可进行写也可进行读操作;显示器文件则只可进行写操作;而键盘文件只可进行读操作。 当程序与一个文件交换信息时,必须通过“打开文件”的操作将一个文件与一个流(类对象)联系起来。一旦建立了这种联系,以后对该流(类对象)的访问就

3、是对该文件的访问,也就是对一个具体设备的访问。可通过“关闭文件”的操作将一个文件与流(类对象)的联系断开。,4,3. C+的基本流类系统 在头文件 “iostream.h” 中说明(预定义)了一批基本流类: ios - 基本流类的基类; istream - 由ios派生,支持输入(提取“”)操作; ostream - 由ios派生,支持输出(插入“”)操作; iostream - 由istream与ostream共同派生,支持输入和输出双向操作。,5,C+预定义的流有: extern istream cin; - 对象cin对应于键盘文件 extern ostream cout; - 对象co

4、ut对应于显示器文件 extern ostream cerr; - 对象cerr对应于显示器文件 extern ostream clog; - 对象clog对应于显示器文件 程序中可直接对上述4个预定义流类对象进行读写,而不必先进行“打开文件”的操作,使用完后也不需要进行“关闭文件”的操作(因为这些流类对象与文件之间的联系是预定义好的,可认为系统已为每一程序都隐含进行了对它们的打开与关闭操作)。,6,4. C+的文件流类系统 在头文件“fstream.h”中说明(预定义)了一批文件流类,专用于磁盘文件: ifstream - 由istream派生,支持从磁盘文件中输入(读入)数据; ofstr

5、eam - 由ostream派生,支持往磁盘文件中输出(写出)数据; fstream - 由iostream派生,支持对磁盘文件进行输入和输出数据的双向操作。 C+中没有预定义的文件流(类对象),程序中用到的所有文件流类对象都要进行自定义。,7,*10.2 插入与提取运算符的重载 - 参看书p231, 10.1节后半,对自定义类complex重载输入输出运算符“”: #include class complex double r; double i; public: complex(double r0=0, double i0=0) r=r0; i=i0; complex operator +

6、(complex c2); complex operator *(complex c2); friend istream,8,注意: 1. 通常总以友元方式来重载输入输出运算符,而且大都使用类似于上述的重载格式。 2. 其中的“operator”用于完成从istream类的流类对象in上(如对应实参可为cin,即指定从键盘上)输入一个复数的有关数据放入complex型引用对象com中;而“operatorc1c2;”这样的调用语句。另外,“operator ”的第二形参com也必须被说明成引用“complex& com”,目的则是要将输入数据直接赋值给对应实参变量(所拥有的存储空间中)。,9,

7、complex complex:operator +(complex c2) complex c; c.r=r+c2.r; c.i=i+c2.i; return c; complex complex:operator * (complex c2) complex temp; temp.r=(r*c2.r)-(i*c2.i); temp.i=(r*c2.i)+(i*c2.r); return temp; ,10,istream,11,coutc3; coutc3;”则等同于使用“operator(cin, c3);”。 */ 程序执行后,屏幕显示结果为: c1=(1, 1) c2=(2, 3)

8、c1+c2=(3, 4) c1*c2=(-1, 5) Input c3:3 -5 c3+c3=(6, -10),12,10.3 对输入输出格式进行控制 10.3.1 格式控制函数及格式控制符 10.3.2 输入输出格式控制示例,13,10.3.1 格式控制函数及格式控制符 - 参看书p234, 10.4节,1. ios类中常用的公有格式控制成员函数 在ios类中定义了一批公有的格式控制标志位以及一些成员函数,通常先用某些成员函数来设置标志位,然后再使用另一些成员函数来进行格式输出。另外,ios类中还设置了一个long型的数据成员用来记录当前被设置的格式状态,该数据成员被称为格式控制标志字(或标

9、志状态字)。标志字是由格式控制标志位来“合成”的。 注意,ios类作为诸多I/O流类的基类,其公有成员函数当然可被各派生类的对象所直接调用。,14,(1) ios:flags a. 格式一: long flags( long lFlags ); 通过参数lFlags来重新设置标志字。 表示各标志位的枚举常量有(参看p235): ios:skipws ios:left ios:right . ios:stdio 每一枚举常量值都代表着格式控制标志字中的某一个二进制位(bit),当设置了某个标志位属性时,该位将取值“1”,否则该位取值“0”。,15,另外注意,通过使用位运算符“|”可将多个格式控制

10、标志位属性进行“合成”。但从使用角度看,所设置的标志位属性不能产生互斥。例如,格式控制标志字中设立了三个平行的标志位(ios:dec、ios:oct和ios:hex)用于表示数制,程序员应保障任何时刻只设置其中的某一个标志位。还有表示对齐标志位的ios:left、ios:right和ios:internal,以及表示实数格式标志位的ios:scientific和ios:fixed,这些互斥属性也不能同时设置。 b. 格式二: long flags(); 返回当前的标志字。,16,(2) ios:setf a. 格式一: long setf( long lFlags ); 通过参数lFlags来

11、设置指定的格式控制标志位。 注意,与flags函数的“替换”方式不同,此处为“添加”方式,即是说,它并不更改其它lFlags不涉及到的那些标志位的当前值。 b. 格式二: long setf( long lFlags, long lMask ); 设置指定的格式控制标志位的值(首先将第二参数lMask所指定的那些位清零,而后用第一参数lFlags所给定的值来重置这些标志位)。,17,例如,为保障所设置的数制标志位不产生互斥,当要设置16进制时使用: setf(ios:hex, ios:basefield); 其中的ios:basefield为一个在ios类中定义的公有静态常量,它的取值为ios

12、:dec|ios:oct|ios:hex。 同理,当要设置对齐标志位为ios:right以及实数格式标志位为ios:fixed,要使用: setf(ios:right, ios:adjustfield); setf(ios:fixed, ios:floatfield); 其中用到了公有静态常量ios:adjustfield和ios:floatfield。 ios:adjustfield的取值为ios:left|ios:right|ios:internal,而ios:floatfield的取值为ios:scientific|ios:fixed。,18,(3) ios:unsetf long un

13、setf( long lFlags ); 通过参数lFlags来清除指定的格式控制标志位。 (4) ios:fill char fill( char cFill ); 将“填充字符”设置为cFill, 并返回原“填充字符”。,19,(5) ios:precision int precision( int np ); 设置浮点数精度为np并返回原精度。当格式为ios:scientific或ios:fixed时,精度np指小数点后的位数,否则指有效数字。 (6) ios:width int width( int nw ); 设置当前被显示数据的域宽nw并返回原域宽。默认值为0,将按实际需要的域宽进

14、行输出。此设置只对随后的一个数据有效,而后系统立刻恢复域宽为系统默认值0。,20,2. 常用的输入输出格式控制符 可直接用于提取和插入算符(“”和“”)之后,而不像格式控制成员函数那样必须被单独调用。 (1) iostream.h中含有的无参格式控制符(参看p237): . endl . ends . flush . ws . dec . hex . oct,21,(2) iomanip.h中含有的有参格式控制符(参看p237): . setbase( int base ) . resetiosflags( long lFlags ) . setiosflags( long lFlags )

15、. setfill( char cFill ) . setprecision( int np ) . setw( int nw ),22,10.3.2 输入输出格式控制示例,1. 格式控制示例一 ( flags和setf等函数的功能) #include void main() coutios basefield; /输出:112 cout“ “(ios:dec|ios:oct|ios:hex)endl; /输出:112 coutios:adjustfield; /输出:14 cout“ “(ios:left|ios:right|ios:internal)endl; /输出:14 coutios

16、:floatfield; /输出:6144 cout“ “(ios:scientific|ios:fixed)endl; /输出:6144,23,/flags将重新设置标志字,“替换”方式 cout.flags(ios:showbase); coutcout.flags()endl; /输出:128 cout.flags(ios:showpoint); coutcout.flags()endl; /输出:256 cout.unsetf(ios:showpoint); coutcout.flags()endl; /输出:0 /setf为“添加”方式 cout.setf(ios:showbase); coutcout.flags()endl; /输出:128 cou

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号