《第27讲基本输入输出流》由会员分享,可在线阅读,更多相关《第27讲基本输入输出流(22页珍藏版)》请在金锄头文库上搜索。
1、The Lecturer:姚雅鹃姚雅鹃E-mail:第二十七讲第二十七讲 基本输入基本输入/ /输出流输出流 输入输入/输出流类体输出流类体系系 输入输入/输出输出格式控格式控制制P315 C+将输入将输入/输出的数据处理为输出的数据处理为字节序字节序列列,并形象地称之为,并形象地称之为“流流”( (stream) )。输入输入设备设备内部内部程序程序数据数据输入流输入流输出流输出流数据数据输出输出设备设备为了实现数据的输入为了实现数据的输入/输出,输出, C+定定义了一系列类,称为流类。义了一系列类,称为流类。数据在程序和设备之间数据在程序和设备之间“流动流动”一、输入一、输入/输出流类体系
2、输出流类体系 I/O流类继承关系流类继承关系流基类流基类通用输入流基类通用输入流基类通用输出流基类通用输出流基类通用输入输出流基类通用输入输出流基类在这些已定义的类中,在这些已定义的类中,给出了若干方法给出了若干方法(成员函数成员函数),用于控制输入输出。用于控制输入输出。 cin和和cout分别是分别是istream类和类和ostream类的对象,由类的对象,由C+事先定义。事先定义。 使用使用I/O流类,程序中需包含头文件流类,程序中需包含头文件。一、输入一、输入/输出流类体系输出流类体系 cin是缓冲流:操作系统将用户输入的内容是缓冲流:操作系统将用户输入的内容先放入内存缓冲区,当用户输
3、入结束按回车先放入内存缓冲区,当用户输入结束按回车( (Enter) )时,时,cin从缓冲区提取数据。从缓冲区提取数据。二、输入二、输入/输出格式控制输出格式控制1. 缺省的输入缺省的输入/输出格式输出格式1)缺省的输入格式)缺省的输入格式输入输入设备设备内部内部程序程序数据数据输入流输入流输出流输出流数据数据输出输出设备设备内内存存缓缓冲冲区区内内存存缓缓冲冲区区 输入的数据类型必须与定义的变量输入的数据类型必须与定义的变量类型一致。类型一致。二、输入二、输入/输出格式控制输出格式控制1. 缺省的输入缺省的输入/输出格式输出格式1)缺省的输入格式)缺省的输入格式 输入数据时,数据之间的分隔
4、符缺省为:输入数据时,数据之间的分隔符缺省为: (空格键)(空格键) (制表键)(制表键) (回车键)(回车键) 这三个键通称为这三个键通称为空白字符空白字符。 整型数:十进制、域宽为整型数:十进制、域宽为0、右对齐、右对齐、空格填充。空格填充。二、输入二、输入/输出格式控制输出格式控制1. 缺省的输入缺省的输入/输出格式输出格式2)缺省的输出格式)缺省的输出格式 实型数:精度实型数:精度6位、浮点输出、域宽为位、浮点输出、域宽为0、右、右对齐、空格填充。对齐、空格填充。 若整数部分超过若整数部分超过7位或有效数字在小数点后位或有效数字在小数点后第第4位之后,自动转换为科学计数法格式。位之后,
5、自动转换为科学计数法格式。若数据的实际宽度超过域宽,若数据的实际宽度超过域宽,则按实际长度输出。则按实际长度输出。 字符或字符串:域宽为字符或字符串:域宽为0、右对齐、右对齐、空格填充。空格填充。 e.g.27_1 标准输出的缺省格式。标准输出的缺省格式。#include#includeusing namespace std;void main() double d1=12.3456789, d2=123456.789, d3=0.0000123456; coutd1 , d2 , d3endl; coutsetw(10)d1 , setw(10)d2 , setw(10)d3endl; ch
6、ar s10=abcd, c=k; couts , setw(4)cendl;输出结果:输出结果:12.3457, 123457, 1.23456e-00512.3457, 123457, 1.23456e-005abcd, k ( ( 表示空格表示空格) )二、输入二、输入/输出格式控制输出格式控制2. 控制输入控制输入/输出格式输出格式1)使用格式状态标志和成员函数)使用格式状态标志和成员函数P319在在 ios 类中,定义了一个公有的枚举类中,定义了一个公有的枚举成员,用于控制输入输出格式。成员,用于控制输入输出格式。enum / 部分内容如下,含义见部分内容如下,含义见319页表页表1
7、4-1 skipws=0x0001, /跳过输入中的空白字符跳过输入中的空白字符 . dec=0x0010, /将数据将数据转换成十进制转换成十进制 oct=0x0020, /将数据将数据转换成八进制转换成八进制 hex=0x0040, /将数据将数据转换成十六进制转换成十六进制 showbase=0x0080, /输出输出时带表示数制的前导符时带表示数制的前导符 ; /每个枚举常量代表一种格式状态标志每个枚举常量代表一种格式状态标志访问这些枚举常量的方法:访问这些枚举常量的方法:ios:skipwsios:dec、ios:showbase等等等等二、输入二、输入/输出格式控制输出格式控制2.
8、 控制输入控制输入/输出格式输出格式1)使用格式状态标志和成员函数)使用格式状态标志和成员函数在在 ios 类中,还定义了一个类中,还定义了一个保护的保护的长整型长整型成员,称为输入输出成员,称为输入输出状态标志字状态标志字: protected: long x_flag;C+使用使用x_flag的低的低16位,每一个二进制位,每一个二进制位代表一种格式状态,值为位代表一种格式状态,值为1时表示开启,时表示开启,值为值为0时表示关闭。时表示关闭。多个枚举常量组合成多个枚举常量组合成x_flag,控制输入输,控制输入输出格式。出格式。 . XXXX XXXX XXXX XXXXx_flag如如:
9、 :ios:oct | ios:showbase 组合出的组合出的x-flag为为: . 0000 0000 1010 0000,即即0x00A0 表示按八进制输出数据,并输出前导符表示按八进制输出数据,并输出前导符0ios:dec=0x0010 代表该位代表该位表示按十进制ios:oct=0x0020 代表该位代表该位表示按八进制ios:hex =0x0040 代表该位代表该位表示按十六进制ios:showbase=0x0080 代表该位代表该位表示输出数制前导符表示输出数制前导符二、输入二、输入/输出格式控制输出格式控制2. 控制输入控制输入/输出格式输出格式1)使用格式状态标志和成员函数
10、)使用格式状态标志和成员函数由于由于x_flag是是ios的保护成员,对象的保护成员,对象 cin、cout不能直接访问,所以不能直接访问,所以ios类提供了一些类提供了一些公有成员函数来设置公有成员函数来设置 x_flag。setf( (格式状态标志格式状态标志) ) 功能:功能:开启格式状态开启格式状态unsetf( (格式状态标志格式状态标志) ) 功能:取消功能:取消格式状态格式状态P320#includeusing namespace std;void main() char c1, c2, c3; cin.unsetf(ios:skipws); / 设置不跳过空白字符设置不跳过空白
11、字符 cinc1c2c3; coutc1c2c3#xy; coutx , yendl; / 缺省以十进制输出缺省以十进制输出e.g.27_2 分析以下程序。分析以下程序。假设先输入:假设先输入:a b c再输入:再输入:10 20输出:?输出:?二、输入二、输入/输出格式控制输出格式控制2. 控制输入控制输入/输出格式输出格式2)使用流操纵符)使用流操纵符在头文件在头文件中定义了一些流中定义了一些流操纵符,用于控制操纵符,用于控制I/O格式。格式。P322常用的有常用的有dec、oct、hex、endl、 setbase()、setw()、setfill()、setprecision()、se
12、tiosflags()#include#includeusing namespace std;void main() int x, y, a, b; cinhexxy; cinoctab; coutsetbase(10)setw(8)setfill( * )x , setfill( $ )setw(4)yendl; coutsetiosflags(ios:left) a , setw(8)bendl; e.g.27_3 控制输入输出格式。控制输入输出格式。假设输入:假设输入:10 2010 20输出:?输出:?#include #includeusing namespace std;void
13、main() double x=12.34567; coutxendl; coutsetprecision(4)xendl; /设置以定点数格式输出设置以定点数格式输出 cout.setf(ios:fixed, ios:floatfield); coutxendl; /设置以科学表示法格式输出设置以科学表示法格式输出 cout.setf(ios:scientific, ios:floatfield); coutsetprecision(2)xendl;e.g.27_4 控制实型数的输出精度。控制实型数的输出精度。运行结果:运行结果:12.3457 /默认默认6位精度位精度12.35 /设置为设
14、置为4位精度位精度12.3457 /小数点后小数点后4位数字位数字1.23e+001 /小数点后小数点后2位数字位数字二、输入二、输入/输出格式控制输出格式控制3. 成员函数成员函数get()和和getline()get()与与getline()是类是类istream定义的定义的成员函数,可读取空白字符,因此成员函数,可读取空白字符,因此可解决可解决cin读取字符串时遇空格结束读取字符串时遇空格结束的问题。的问题。P317二、输入二、输入/输出格式控制输出格式控制3. 成员函数成员函数get()和和getline() get()的重载形式:的重载形式:int get();istream & g
15、et(char &);istream & get(char *, int , char=n); getline()的原型:的原型:istream & getline(char *, int , char=n);二、输入二、输入/输出格式控制输出格式控制3. 成员函数成员函数get()和和getline() 带带3个参数的个参数的get()和和getline()的区别的区别 get()遇遇n会结束,会结束,n留在输入留在输入流中,即接下来的读取从该流中,即接下来的读取从该n开始开始 getline()遇遇n会结束,会结束,n不留在不留在输入流中,也不被读取,而是从输入流中输入流中,也不被读取,而
16、是从输入流中删除删除#includeusing namespace std;void main( ) char c1, c2, c3; char str180, str2100; cout“输入三个字符:输入三个字符:; c1=cin.get(); cin.get(c2).get(c3); cin.get(); cout“输入第一行字符串输入第一行字符串:; cin.get(str1, 80); cin.get(); cout“输入第二行字符串:输入第二行字符串:; cin.getline(str2, 80);e.g.27_5 读取字符和字符串。读取字符和字符串。假设输入:假设输入:abccomputeroperator/ 读取第一行后的回车读取第一行后的回车/ 读取第二行后的回车读取第二行后的回车/第三行后的回车自动被提取并删除第三行后的回车自动被提取并删除 cout.put(c1).put(c2).put(c3).put(n); puts(str1); puts(str2);运行结果:运行结果:abccomputeroperator成员函数成员函数put()的用法见课本的用法见课本318页页