第10章流类库与输入输出.ppt
《第10章流类库与输入输出.ppt》由会员分享,可在线阅读,更多相关《第10章流类库与输入输出.ppt(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)
17、; coutcout.flags()endl; /输出:128 cout.setf(ios:showpoint); coutcout.flags()endl; /输出:384 cout.unsetf(ios:showpoint); coutcout.flags()endl; /输出:128 ,24,2. 格式控制示例二 对输出数据的宽度、精度等方面进行设置与使用。 #include void main() cout.width(6); /只管随后一个数的域宽 cout478527.4272endl; / 478527.4272 coutsetw(6)4785setw(8)27.4272endl
18、endl; / 4785 27.4272 cout.width(6); cout.precision(3); /当格式为ios:scientific或ios:fixed时,浮点数精度 /np指小数点后的位数,否则指有效数字 /此时设置浮点数的有效数字为3 cout4785setw(8)27.4272endl; / 4785 27.4,25,coutsetw(6)4785setw(8)setprecision(2)27.4272endlendl; / 4785 27 /“setprecision(2)”设置浮点数的有效数字 cout.setf(ios:fixed, ios:floatfield)
19、; /今后以定点格式显示浮点数(无指数部分) cout.width(6); cout.precision(3); /当格式为ios:fixed时,设置小数点后的位数 cout4785setw(8)27.4272endl; / 4785 27.427 ,26,10.4 使用预定义的插入与提取运算符对文件流进行读写操作 10.4.1 文件的打开与关闭 10.4.2 读写操作示例 10.4.1 文件的打开与关闭 - 参看书p244, 10.6.1小节 一. 对自定义磁盘文件进行读写的一般处理过程 处理过程为: 打开文件 = 读写操作 = 关闭文件。,27,“打开文件”通常通过构造函数自动完成(也可显
20、式调用成员函数open完成)。“关闭文件”通常通过使用“.close();”来显式完成。 例1: ofstream outfile1(“myfile1.txt“); 创建ofstream类的对象outfile1;使流类对象outfile1与磁盘文件“myfile1.txt“相联系;并打开用于“写”的磁盘文件“myfile1.txt“。 例2: ofstream outfile1; /创建ofstream类的对象outfile1 outfile1.open(“myfile1.txt“); /显式调用成员函数open来打开文件,28,二. 与创建流类对象相关的三个构造函数 1. ifstream:
21、ifstream ifstream( const char* szName, int nMode = ios:in, int nProt = filebuf:openprot ); 参数: (1) szName - 文件名; (2) nMode - 打开文件的方式。 ios:in - 以读(输入)为目的打开。 ios:nocreate - 仅打开一个已存在文件。 ios:binary - 打开二进制文件。 (3) nProt - 指定所打开文件的保护方式。,29,2. ofstream:ofstream ofstream( const char* szName, int nMode = ios
22、:out, int nProt = filebuf:openprot ); 参数: (1) szName - 文件名; (2) nMode - 打开文件的方式。 ios:out - 以写(输出)为目的打开文件。 ios:trunc - 若文件存在,则将文件长度截为0。 ios:binary - 打开二进制文件。 ios:app - 以追加方式打开。 . (3) nProt - 指定所打开文件的保护方式。,30,3. fstream:fstream fstream( const char* szName, int nMode, int nProt = filebuf:openprot ); 参数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 章流类库 输入输出
链接地址:https://www.31doc.com/p-2250696.html