第七章C+的I/0流类 库
第七章 C++的I/O流类 库
71C++为何建立自己的输入输出系统 C++除了完全支持C语言的输入输出系统外,还定义了一套面向对 象的输入输出系统。为什么C++还要建立自己的输入输出系统呢 C语言的输入输出系统不支持用户自定义的对象,如: Struct my_ struct int i. float f char“str; 对此结构类型,在C语言中下面的语句是不能接受的: printf("/my_ struct",s); 因为 printf(函数只能识别系统预定义的类型,而没有办法对新 的数据类型进行扩充,。用C++的输入输出系统,就可以通过重载 “>”运算符来解以上问题。C++的类机制允它建立 个可扩展的输入输出系统,它可以通过修改和扩展来加入用户自 定义类型及相应操作
7.1 C++为何建立自己的输入输出系统 C++除了完全支持C 语言的输入输出系统外,还定义了一套面向对 象的输入输出系统。为什么C ++还要建立自己的输入输出系统呢? C 语言的输入输出系统不支持用户自定义的对象,如: Struct my_struct{ int i; float f; char *str; }s; 对此结构类型,在C语言中下面的语句是不能接受的: printf(“%my_struct”,s); 因为printf( )函数只能识别系统预定义的类型,而没有办法对新 的数据类型进行扩充.。用C++的输入输出系统,就可以通过重载 “>”运算符来解以上问题。C++的类机制允它建立一 个可扩展的输入输出系统,它可以通过修改和扩展来加入用户自 定义类型及相应操作。 1
C++的流及流类库 7.21c++的流 输入输出是一种数据传递操作,它可以看作字符序列在主机与外 部介质之间的流动。流( stream为从源(或生产者到目的(或消 费者)的数据流的引用。流具有方向性:与输入设备(如键盘)相 联系的流称为输入流;与输出设备(如屏幕)相联系的流称为输出 流;与输入输出设备(如磁盘)相联系的流称为输入输出流。 C++中包含几个预定义的流: 标准输入流 cin与标准输入设备相关联 标准输出流 cout与标准输出设备相关联 非缓冲型标准出错流cerr与标准错误输出设备相关联(非缓冲方式) 缓冲型的标准出错流clog与标准错误输出设备相关联(缓冲方式) 在缺省情况下,指定的标准输出设备是显示终端,标准输入设备 是键盘。 在任何情况下(有时用户把标准输出设备定向为其它设备),指 定的标准错误输出设备总是显示终端。 cerr<<The average cannot be computed. In
7.2 C++的流及流类库 7.2.1 C++的流 输入输出是一种数据传递操作,它可以看作字符序列在主机与外 部介质 之间的流动。流(stream)为从源(或生产者)到目的(或消 费者)的数据流的引用。流具有方向性: 与输入设备(如键盘)相 联系的流称为输入流;与输出设备(如屏幕)相联系的流称为输出 流;与输入输出设备(如磁盘)相联系的流称为输入输出流。 C++中包 含几个预定义的流: 标准输入流 cin 与标准输入设备相关联 标准输出流 cout 与标准输出设备相关联 非缓冲型标准出错流 cerr 与标准错误输出设备相关联(非缓冲方式) 缓冲型的标准出错流 clog 与标准错误输出设备相关联(缓冲方式) 在缺省情况下,指定的标准输出设备是显示终端,标准输入设备 是键盘。 在任何情况下(有时用户把标准输出设备定向为其它设备),指 定的标准错误输出设备总是显示终端。 cerr<<“The average cannot be computed.\n”; 2
722流类库 C+流类库是用继承方法建立起来的一个输入输出类库。它具有 两个平行的基类: streambuf类,ios类。所有其它的流类都是 从它们直接或间接地派生出来的。使用C++的流类库,程序中可 能应包含的头文件: iostream.h strstream h fstream h iomanip. h 1. streambuf类 streambuf 派生 filebuf strstreambuf conbuf
7.2.2 流类库 C++流类库是用继承方法建立起来的一个输入输出类库。它具有 两个平行的基类:streambuf 类, ios 类。所有其它的流类都是 从它们直接或间接地派生出来的。使用C++的流类库,程序中可 能应包含的头文件: iostream.h strstream.h fstream.h iomanip.h 1. streambuf 类 streambuf filebuf strstreambuf conbuf 派生 3
2.ios类 stream fstreambase strstreambase+ ostream ifstream istrstream ofstream bstrstreamconstream istream withassign fstreamstrstream bstream withassign iostream iostream withassign
2. ios 类 ios istream fstreambase strstreambase ostream ifstream istrstream ofstream ostrstream constream istream_withassign fstream ostream_withassign iostream_withassign strstream iostream 4
3输入输出的格式控制 73.1用ios类的成员函数进行格式控制 ios类中有几个成员函数可以用来对输入输出进行格式控制。 主要控制状态标志字、域宽、填充字符及输出精度 1.状态标志字 状态标志存放在数据成员 long x flags中。ios类 public中定义 了一个枚举,它的每个成员可以分别定义状标志字的一个位,每 位都称为一个状标志位
7.3输入输出的格式控制 7.3.1 用ios 类的成员函数进行格式控制 ios类中有几个成员函数可以用来对输入输出进行格式控制。 主要控制 状态标志字、域宽、填充字符及输出精度。 1. 状态标志字 状态标志存放在数据成员long x_flags 中。ios 类 public 中定义 了一个枚举,它的每个成员可以分别定义状标志字的一个位,每 一位都称为一个状标志位。 5
这个枚举定义如下: enum{00000000001 skipws=0x0001,跳过输入中的空白,可用于输入 left=0x0002,左对齐输出,可用于输出 right=0x0004,右对齐输出,可用于输出 interna|=0x0008,在符号位和基指示符后填入字符,可用于输出 dec=0x0010,转换基数为十进制,可用于输入或输出 oct=0x0020,转换基数为八进制,可用于输入或输出 hex=0x0040,转换基数为十六进制,可用于输入或输出 showcase=0x0080,在输出时显示基指示符,可于输入或输出 showpoint=0x0100,在输出时显示小数点,可用于输出 uppercase=0x0200,十六进制输出时,表示制式的和表示数值的 字符一律为大写,可用于输出 showpos=0x0400,正整数前显示”+”符号,可用于输出 scientific=0x0800,用科学表示法显示浮点数,可用于输出 fied=0x1000,用定点形式显示浮点数,可用于输出 unitbuf=0x2000,在输出操作后立即刷新所有流,可用于输出 stdio=0x4000,在输出操作后刷新 stdout和 stderr.,可用于输
.这个枚举 定义 如下: enum{ 0000 0000 0000 0001 skipws =0x0001,跳过输入中的空白,可用于输入 left =0x0002,左对齐输出,可用于输出 right =0x0004,右对齐输出,可用于输出 internal =0x0008,在符号位和基指示符后填入字符,可用于输出 dec =0x0010,转换基数为十进制,可用于输入或输出 oct =0x0020,转换基数为八进制,可用于输入或输出 hex =0x0040,转换基数为十六进制,可用于输入或输出 showbase =0x0080,在输出时显示基指示符,可于输入或输出 showpoint =0x0100,在输出时显示小数点,可用于输出 uppercase =0x0200,十六进制输出时,表示制式的和表示数值的 字符一律为大写 ,可用于输出 showpos =0x0400,正整数前显示”+”符号,可用于输出 scientific =0x0800,用科学表示法显示浮点数,可用于输出 fixed =0x1000,用定点形式显示浮点数,可用于输出 unitbuf =0x2000,在输出操作后立即刷新所有流,可用于输出 stdio =0x4000,在输出操作后刷新stdout 和stderr,可用于输 出 }; 6
x flags取以上枚举值的并存,即 x_ flags上的每位长整数为16 位)中的01相当于一个枚举值。例如 x_ flags中放0x0011或 17即为000Q000000010001相当于0X0001与0x0010之 并 skipws(0x0001)0000000001 dec(0X0010)+0000000000010000 x_ flags(0x0011)0000000000010001
2 x_flags取以上枚举值的并存,即x_flags上的每一位(长整数为16 位)中的0 1相当于一个枚举值。例如 x_flags 中放 0x0011 或 17即为 0000 0000 0001 0001 相当于 0x0001 与 0x0010 之 并 skipws(0x0001) 0000 0000 0000 0001 dec (0x0010) + 0000 0000 0001 0000 x_flags (0x0011) 0000 0000 0001 0001 7
2.ios类中用于控制输入输出格式的成员函数 函数原型 功能 long ios:se( ong flags;设置状态标志fags long ios:unse( ong flags);清除状态标志,并返回前标志 long ios: flags( 测试状态标志 long ios: flags( ong flags;设置标志fags,并返回前标志 int ios: width(; 返回当前的宽度设置值 int ios: width(int w); 设置域宽W,返回以前的设置 int ios:: precision(mtp);设置小数位数p返回以前的小数位数 char ios: fillo 返回当前的填充字符 char ios: fill(char ch);2设置填充字符ch返回当前的填充字符
2. ios类中用于控制输入输出格式的成员函数 函数原型 功能 long ios::setf(long flags); 设置状态标志flags long ios::unsetf(long flags); 清除状态标志,并返回前标志 long ios::flags(); 测试状态标志 long ios::flags(long flags); 设置标志flags,并返回前标志 int ios::width(); 返回当前的宽度设置值 int ios::width(int w); 设置域宽w,返回以前的设置 int ios::precision(int p); 设置小数位数p返回以前的小数位数 char ios::fill(); 返回当前的填充字符 char ios::fill(char ch); 设置填充字符ch返回当前的填充字符 8
(1)设置状态标志 设置状态标志,即是将某一状态标志位置“1”,可使用sett函 数 其一般的调用格式为:流对象.set(ios:状态标志) 例71 include maino i istream cin ∥)象cn可不定义 ostream cout: ∥)象cout可不定义 cin, sett(ios: ships);∥键盘输入时跳过输入空白 cout setf(ios: left) ∥设置输出左对齐 cout set(ios: showpos ios: sciengific);∥中间用运算符“|”分 隔 cout<<567<<”<<567.89<<end; 设置 showpos使得每个正数前添加“+”号,设置 sciengific使浮点 数按科学表示法 指数形式进行显示,输出结果: +567 +56789e02
(1)设置状态标志 设置状态标志,即是将某一状态标志位置“1”,可使用setf()函 数 其一般的调用格式为:流对象.setf(ios::状态标志); 例7.1 #include main() { istream cin; //对象cin可不定义 ostream cout; //对象cout可不定义 cin.setf(ios::shipws); //键盘输入时跳过输入空白 cout.setf(ios::left); //设置输出左对齐 cout.setf(ios::showpos | ios::sciengific);//中间用运算符 “|”分 隔 cout<<567<<“ ” <<567.89<<endl; } 设置showpos使得每个正数前添加“+”号, 设置sciengific使 浮点 数按科学表示法 (指数形式)进行显示,输出结果: +567 +567.89e02 注意:要设置多项标志时,中间用或运算符 “|” 分隔。 9