VC程序设计第九章.ppt
《VC程序设计第九章.ppt》由会员分享,可在线阅读,更多相关《VC程序设计第九章.ppt(58页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第九章第九章 流类库和输入流类库和输入/输出输出本本章章的的目目的的就就是是把把数数据据保保存存到到磁磁盘盘文文件件中中,C+同同时时解决了更多的问题。解决了更多的问题。C+语言中并没有输入语言中并没有输入/输出语句,而是在标准库输出语句,而是在标准库里包含了一个里包含了一个I/O流类库,它与标准模板库同为流类库,它与标准模板库同为C+标标准库中最重要的组成部分。数据从一个对象到另一个对准库中最重要的组成部分。数据从一个对象到另一个对象的传送被抽象为象的传送被抽象为“流流”。数据的输入。数据的输入/输出就是通过输输出就是通过输入入/输出流来实现的。输出流来实现的。流是一种抽象的概念,负责在数据
2、的产生者和数据流是一种抽象的概念,负责在数据的产生者和数据的使用者之间建立联系,并管理数据的流动。的使用者之间建立联系,并管理数据的流动。第九章第九章 流类库和输入流类库和输入/输出输出9.1 C+的基本流类体系的基本流类体系 9.3 标准设备的输入标准设备的输入/输出输出 9.2 输入输出的格式控制输入输出的格式控制 9.4 文件的输入与输出文件的输入与输出 9.7 图书馆流通管理系统设计图书馆流通管理系统设计 输出输出/输入流的应用输入流的应用 9.5 字符串流(内存流)字符串流(内存流)9.6 MFC中的文件处理中的文件处理 9.1 C+的基本流类体系的基本流类体系整个流类体系是一个派生
3、类体系。整个流类体系是一个派生类体系。按按ANSI C+标准,类标准,类ios是抽象类,它的析构函数是虚函数,它的构造函数为保护的,是抽象类,它的析构函数是虚函数,它的构造函数为保护的,作为所有基本流类的虚基类。作为所有基本流类的虚基类。VC+中有一个构造函数中有一个构造函数ios(streambuf*)为公有,与为公有,与ANSI C+不同。不同。图图9.1 输输入入/输输出出流流类类派派生生体体系系iosstreambufistreamostreamistream_withassigniostreamostream_withassigniostream_withassign指针指针9.1
4、C+的基本流类体系的基本流类体系iostreamfstreamstrstreamstdiostreamiosistreamifstrstreamistream_withassignifstreamstreambuffilebufstrstreambufstdiobufiostream_initostreamofstreamostream_withassign ostrstream图图9.2 输入输入/输出流类层次输出流类层次streambuf是一个独立的是一个独立的类,只是类,只是ios有一个保护访有一个保护访问限制的指针指向它。问限制的指针指向它。streambuf的作用是管理的作用是管理一
5、个流的缓冲区。一个流的缓冲区。ios提供提供了对流进行格式化输入输了对流进行格式化输入输出和错误处理的成员函数。出和错误处理的成员函数。所有派生都是公有派生。所有派生都是公有派生。istream类提供完成类提供完成提取提取(输入)(输入)操作的成员函数,操作的成员函数,而而ostream类提供完成类提供完成插插入(输出)入(输出)操作的成员函操作的成员函数。数。iostream类是前两者类是前两者的组合。的组合。9.1 C+的基本流类体系的基本流类体系在流类库中,最重要的两部分功能为在流类库中,最重要的两部分功能为标准输入标准输入/输出输出(standard standard input/ou
6、tputinput/output)和和文件处理文件处理。在。在C+C+的流类库中定义了四个全局流对的流类库中定义了四个全局流对象:象:cincin,coutcout,cerrcerr和和clogclog。使用这四个流对象,可以完成人机交使用这四个流对象,可以完成人机交互的功能。互的功能。cin称标准输入流(对象),以键盘为其对应的标准设备。称标准输入流(对象),以键盘为其对应的标准设备。cout称标准输出流(对象),以显示器为标准设备。称标准输出流(对象),以显示器为标准设备。cerr和和clog称称为标准错误输出流,标准错误输出设备也是显示器。其中为标准错误输出流,标准错误输出设备也是显示器
7、。其中cin、cout和和clog是带缓冲区的,缓冲区由是带缓冲区的,缓冲区由streambuf类对象来管理。而类对象来管理。而cerr为非缓冲区流,一旦错误发生立即显示。为非缓冲区流,一旦错误发生立即显示。要使用这四个功能,必须要使用这四个功能,必须包含包含文件。文件。提取运算符提取运算符“”(stream_extraction operator)和)和插入运插入运算符算符“”(stream_insertion operator),执行输入),执行输入/输出操作。输出操作。“提取提取”的含义是指输入操作,可看作从流中提取一个字符序列,的含义是指输入操作,可看作从流中提取一个字符序列,而而“插
8、入插入”的含义是指输出操作,可看作向流中插入一个字符序列。的含义是指输出操作,可看作向流中插入一个字符序列。文件处理完成永久保存的功能。在文件处理完成永久保存的功能。在VC+VC+的的MFCMFC编程中采用了序列编程中采用了序列化(化(SerializationSerialization)。)。9.2 输入输出的格式控制输入输出的格式控制C+在类在类ios中提供格式化输入输出。中提供格式化输入输出。这些格式是对所有文本方式这些格式是对所有文本方式的输入输出流均适用。的输入输出流均适用。格式控制符定义为公有的无名的枚举类型:格式控制符定义为公有的无名的枚举类型:enum skipws=0 x00
9、01/跳过输入中的空白字符跳过输入中的空白字符 left=0 x0002,/输出左对齐输出左对齐 right=0 x0004,/输出右对齐输出右对齐 internal=0 x0008,/在输出符号或数制字符后填充在输出符号或数制字符后填充 dec=0 x0010,/在输入输出时将数据按十进制处理在输入输出时将数据按十进制处理 oct=0 x0020,/在输入输出时将数据按八进制处理在输入输出时将数据按八进制处理 hex=0 x0040,/在输入输出时将数据按十六进制处理在输入输出时将数据按十六进制处理 showbase=0 x0080,/在输出时带有表示数制基的字符在输出时带有表示数制基的字符
10、 showpoint=0 x0100,/输出符点数时输出符点数时,必定带小数点必定带小数点 uppercase=0 x0200,/输出十六进制输出十六进制,用大写用大写 showpos=0 x0400,/输出正数时输出正数时,加加”+”号号 scientific=0 x0800,/科学数方式输出浮点数科学数方式输出浮点数 fixed=0 x1000,/定点数方式输出实数定点数方式输出实数 unitbuf=0 x2000,/插入后插入后,立即刷新流立即刷新流 stdio=0 x4000/插入后插入后,立即刷新立即刷新stdout和和stderr9.2 输入输出的格式控制输入输出的格式控制该枚举量
11、说明中该枚举量说明中每一个枚举量实际对应两字节数据(每一个枚举量实际对应两字节数据(16位)中的一个位位)中的一个位,所以可以同时采用几个格式控制,只要把所以可以同时采用几个格式控制,只要把对应位置对应位置1即可,这样既方便又即可,这样既方便又节约内存。取多种控制时,用或节约内存。取多种控制时,用或“|”运算符来合成,合成为一个长整型运算符来合成,合成为一个长整型数,在数,在ios中为:中为:protected:long x_flags;访问访问x_flags的重载函数定义如下:的重载函数定义如下:inline long ios:flags()const return x_flags;/返回当
12、前标志字返回当前标志字inline long ios:flags(long _l)/参数作为新的标志字参数作为新的标志字,并返回原标志并返回原标志字字 long _l0;_l0=x_flags;x_flags=_l;return _l0;inline long ios:setf(long _l,long _m)long _l0;_l0=x_flag;x_flags=(_l&_m)|(x_flags&(_m);return _l0;/第一个参数为增加的控制第一个参数为增加的控制,第二个参数表示取代原来哪几位第二个参数表示取代原来哪几位inline long ios:setf(long _l)/增
13、加控制增加控制(多项多项)long _l0;_l0=x_flags;x_flags|=_l;return _l0;/增加控制增加控制(多项多项)inline long ios:unsetf(long _l)/清除指定位上的控制清除指定位上的控制 long _l0;_l0=x_flags;x_flags&=(_l);return _l0;9.2 输入输出的格式控制输入输出的格式控制类类ios中还设置了三个中还设置了三个输入输出流格式控制标志输入输出流格式控制标志:protected:int x_precision;/标志浮点数精度标志浮点数精度,缺省为缺省为6位位 int x_width;/输出
14、域宽输出域宽,缺省域宽为缺省域宽为0,/重设域宽只对其后第一输出项有效重设域宽只对其后第一输出项有效,如域宽不足如域宽不足,则不受限制则不受限制 char x_fill;/标志域宽有富余时填入的字符标志域宽有富余时填入的字符相关接口函数为相关接口函数为(此类函数仅要求知道用法此类函数仅要求知道用法):inline int ios:width()constreturn x_width;/返回当前域宽返回当前域宽inline int ios:width(int _i)/把参数作为新的域宽把参数作为新的域宽,返回原域宽返回原域宽 int _i0;_i0=(int)x_width;x_width=_i
15、;return _i0;inline char ios:fill()constreturn x_fill;/返回当前填充字符返回当前填充字符inline char ios:(char _c)/参数作为新填充字符参数作为新填充字符,返回原填充字符返回原填充字符 char _c0;_c0=x_fill;x_fill=_c;return _c0;inline int ios:precision(int i)/参数作为新填充字符参数作为新填充字符,返回原填充字符返回原填充字符 int _i0;_i0=(int)x_presion;x_presion=_i;return _i0;inline int i
16、os:precision()const return x_presion;/返回当前精度返回当前精度9.2 输入输出的格式控制输入输出的格式控制【例例9.1】整型数输出。整型数输出。void main(void)int inum=255;cout”十进制方式十进制方式”inumt;cout.flags(ios:oct|ios:showbase);/八进制带数制基数输出是前面加八进制带数制基数输出是前面加0,参数等效参数等效0 x00a0 cout”八进制方式八进制方式”inumt;cout.setf(ios:hex);/等效等效0 x0040,因是或关系因是或关系,仍带基数输出仍带基数输出,格
17、式为格式为0 x.cout”十六进制方式十六进制方式”inumendl;在在VC+平台上运行本例平台上运行本例程序输出:程序输出:十进制方式十进制方式255 八进制方式八进制方式0377 十六进制方式十六进制方式0 xff9.2 输入输出的格式控制输入输出的格式控制【例例9.2】浮点数输出。浮点数输出。void main()double fnum=31.415926535;cout”缺省域宽为缺省域宽为:”cout.width()”位位”n;cout”缺省精度为缺省精度为:”cout.precision()”位位”n;cout”缺省表达方式缺省表达方式:”funmn;/按值大小按值大小,自动决
18、定定点还是科学数方式自动决定定点还是科学数方式 cout.setf(ios:scientific,ios:floatfield);/floatfield为为0 x1800 cout”科学数表达方式科学数表达方式:”fnumn;cout.setf(ios:fixed,ios:floatfield);/设为定点设为定点,取消科学数方式取消科学数方式 cout”定点表达方式定点表达方式:”fnumn;cout.precision(9);/精度为精度为9位,小数点后位,小数点后9位位 cout.setf(ios:scientific,ios:floatfield);cout”定点定点9位科学数表达方式
19、位科学数表达方式:”fnumendl;其中其中floatfield,是为了避免浮点数互相冲突的双重规定,所以是,是为了避免浮点数互相冲突的双重规定,所以是清清除原浮点数第除原浮点数第13和第和第14两位两位,再用新的一位去代替,再用新的一位去代替。9.2 输入输出的格式控制输入输出的格式控制在在VC+平台上运行本例平台上运行本例程序执行后输出:程序执行后输出:缺省域宽为缺省域宽为:0位位缺省精度为缺省精度为:6位位缺省表达方式缺省表达方式:31.4159科学数表达方式科学数表达方式:3.141593e+001定点表达方式定点表达方式:31.415927定点定点9位科学数表达方式位科学数表达方式
20、:3.141592654e+001 流操作子(流操作子(setiosflags stream manipulator)可代替流格式控制成员函数:)可代替流格式控制成员函数:操作符操作符含含义义boolapha把把true和和false表示表示为为字符串字符串*noboolalpha把把true和和false表示表示为为0、1showbase产产生前生前缀缀,指示数,指示数值值的的进进制基数制基数*noshowbase不不产产生生进进制基数前制基数前缀缀showpoint总总是是显显示小数点示小数点*noshowpoint只有当小数部分存在是才只有当小数部分存在是才显显示小数点示小数点操作符操作
21、符含含义义showpos在非在非负负数数值值中中显显示示+*noshowpos在非在非负负数数值值中不中不显显示示+*skipws输输入操作符跳入操作符跳过过空白字符空白字符noskipws输输入操作符不跳入操作符不跳过过空白字符空白字符uppercase在十六在十六进进制下制下显显示示0X,科学,科学计计数法中数法中显显示示E*nouppercase在十六在十六进进制下制下显显示示0 x,科学,科学计计数法中数法中显显示示e*dec以十以十进进制制显显示示hex以十六以十六进进制制显显示示oct以八以八进进制制显显示示left将填充字符加到数将填充字符加到数值值的右的右边边right将填充字
22、符加到数将填充字符加到数值值的左的左边边Internal将填充字符加到符号和数将填充字符加到符号和数值值的中的中间间*fixed以小数形式以小数形式显显示浮点数示浮点数scientific以科学以科学计计数法形式数法形式显显示浮点数示浮点数flush刷新刷新ostream缓缓冲区冲区操作符操作符含含义义ends插入字符串插入字符串结结束符,然后刷新束符,然后刷新ostream缓缓冲区冲区endl插入插入换换行符,然后刷新行符,然后刷新ostream缓缓冲区冲区ws“吃掉吃掉”空白字符空白字符/以下以下这这些参数化的流操作子要求些参数化的流操作子要求#includesetfill(ch)用用ch
23、填充空白字符填充空白字符setprecision(n)将浮点精度将浮点精度设设置置为为nsetw(n)按照按照w个字符来个字符来读读或者写或者写setbase(b)以以进进制基数制基数b为输为输出整数出整数值值注:注:*表示缺省的流状表示缺省的流状态态cin,cout和和clog都是都是缓冲流缓冲流。输出而言,仅当输出缓冲区满才将缓。输出而言,仅当输出缓冲区满才将缓冲区中的信息输出,对输入而言,冲区中的信息输出,对输入而言,仅当输入一行结束,才开始从缓仅当输入一行结束,才开始从缓冲区中取数据冲区中取数据,当希望把缓冲区中的信息立即输出,可用当希望把缓冲区中的信息立即输出,可用flush,加加e
24、ndl也有同样功能,回车并立即显示,不必等缓冲区满(也有同样功能,回车并立即显示,不必等缓冲区满(endl清清空缓冲区)。空缓冲区)。9.3 标准设备的输入标准设备的输入/输出输出标准设备输入是最不安全的,注意以下几点,可以避免错误。标准设备输入是最不安全的,注意以下几点,可以避免错误。1.cin为为缓冲流缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在果输入错了,必须在回车之前修改回车之前修改,如果回车键按下就无法挽,如果
25、回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。不可能用刷新来清除缓冲区,所以据。不可能用刷新来清除缓冲区,所以不能输错,也不能多输不能输错,也不能多输!2.输入的数据类型必须与要提取的数据类型一致输入的数据类型必须与要提取的数据类型一致,否则出错。出,否则出错。出错只是在流的状态字错只是在流的状态字state(枚举类型(枚举类型io_state)中对应位置)中对应位置位(置位(置1),程序继续。所以要提高健壮性,就必须在编程中),程序继续。所以要提高健壮性,就必须在编程中加入对状态字加入对状态字state的判断
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 程序设计 第九
限制150内