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