概要:
ios_base类表示流的一般特征,如是否可读取、是二进制流还是文本流等;
ios类基于ios_base,其中包括了一个指向streambuf对象的指针成员;
streambuf类为缓中区提供了内存,并提供用于填充缓冲区、访问缓冲区内容、刷新缓冲区和管理缓冲区内存的类方法;
ostream 类是从ios 类派生而来的,提供了输出方法;
istream类也是从ios类派生而来的,提供了输入方法;
iostream类是基于istream和ostream类的,因此继承了输入方法和输出方法。
1.ostream类的类方法
重载的<<运算符
ostream类重新定义了<<运算符,方法是将其重载为输出。在这种情况下,<<叫做插入运算符,插入运算符被重载,使之能够识别c++中所有的基本类型。
原型:ostream & operator<<(Type);
函数返回一个指向ostream对象的引用,这使得可以将输出连接起来。
put()方法
原型:ostream & put(char);
用于显示字符,可以用类方法表示法来调用它:
cout.put(‘W’);
和<<运算符一样,该函数也返回一个指向调用对象的引用,因此可以用它将拼接输出:
cout.put(‘w’).put(‘t’);
write()方法
模板原型:basic_ostream<charT,traits> & write(const char_type* s,streamsize n);
write()的第一个参数提供了要显示的字符串的地址,第二个参数指出要显示多少个字符,使用cout调用write()时,将调用char具体化,因此返回类型为ostream&,
这使得可以将输出拼接起来。
write()方法并不会在遇到空字符时自动停止打印字符,而只是打印指定数目的字符,即使超出了字符串的边界。
刷新输出缓冲区
控制符flush刷新缓冲区,而控制符endl刷新缓冲区,并插入一个换行符。这两个控制符的使用方式与变量名相同:
cout<<“Hello”<<flush;
cout<<“world”<<endl;
控制符也是函数,可以直接调用flush()来刷新cout缓冲区:
flush(cout);
然而,ostream类对<<运算符进行了重载,所以可用下述表达式替换函数调用:
cout<<flush;
因此可以用更为方便的插入表示法来成功地进行刷新。
用cout进行格式化
1.修改显示时使用的计数系统
要控制整数以十进制、十六进制还是八进制显示,可以使用dec、hex和oct控制符。
例如,下面的函数调用将cout 对象的计数系统格式状态设置为十六制:
hex (cout) ;
完成上述设置后,程序将以十六进制形式打印整数值,直到将格式状态设置为其他选项为止。
注意,控制符不是成员函数,因此不必通过对象来调用。
虽然控制符实际上是函数,但它们通常的使用方式为:
cout<<hex;
2.调整字段宽度
可以使用width成员函数将长度不同的数字放到宽度相同的字段中,该方法的原型为:
int width() ;
int width(int i) ;
第一种格式返回字段宽度的当前设置:第二种格式将字段宽度设置为 i个空格,并返回以前的字段宽度值。这使得能够保存以前的值,以便以后恢复宽度值时使用。
width()方法只影响将显示的下一个项目,然后字段宽度将恢复默认值。
使用方法如:cout.width(5);
3.填充字符
在默认情况下,cout用空格填充字段中未被使用的部分,可以用fill()成员函数来改变填充字符。(cout输出时默认右对齐)
例如,下面的函数调用将填充字符改为星号:
cout.fill(‘*’);
4.设置浮点数的显示精度
浮点数精度的含义取决于输出模式。有三种模式:默认模式、定点模式和科学模式。
在默认模式下,它指的是显示的总位数。在定点模式和科学模式下,精度指的是小数点后面的位数。已经知道, C+的默认精度为6位(但未尾的0将不显示)。
precision( )成员函数使得能够选择其他值。例如,下面语句将cout的精度设置为2:
cout.precision(2) ;
和width()的情况不同,但与fill()类似,新的精度设置将一直有效,直到被重新设置。
5.打印末尾的0和小数点
ios_base类提供了一个setf()函数,能够控制多种格式化特性。这个类还定义了多个常量,可用作该函数的参数。
下面的函数调用使cout显示末尾小数点:
cout.setf(ios_base::showpoint);
使用默认的浮点格式时,上述语句还将导致末尾的0被显示出来。
6.setf()函数
setf()函数有两个原型。第一个为:
fmtflags setf(fmtflags);
其中fmtflags是bitmask类型的typedef名,用于存储格式标记。该名称是在ios_base类中定义的。
这个版本的setf()用来设置单个位控制的格式信息,参数是一个fmtflags值,指出要设置哪一位。返回值是类型为fmtflags的数字,指出所有标记以前的设置,
如果打算以后恢复原始设置,则可以保存这个值。
ios_base类定义了代表位值的常量,使用时,必须加上作用域解析运算符。
常量 | 含义 |
ios_base ::boolalpha | 输入和输出bool值,可以为true或false |
ios_base::showbase | 对于输出,使用C++基数前缀(0, 0x) |
ios_base::showpoint | 显示末尾的小数点 |
ios_base::uppercase | 对于16进制输出,使用大写字母,E表示法 |
ios_base::showpos | 在正数前面加上+ |
第二个setf()原型接受两个参数,并返回以前的设置:
fmtflags setf(fmtflags,fmtflags);
函数的这种重载格式用于设置由多位控制的格式选项。第一参数和以前一样,也是一个包含了所需设置的fmtflags值。第二参数指出要清除第一个参数中的哪些位。
第二个参数 | 第一个参数 | 含义 |
ios_base::basefield | ios_base::dec | 使用10进制 |
ios_base::oct | 使用8进制 | |
ios_base::hex | 使用16进制 | |
ios_base::floatfield | ios_base::fixed | 使用定点计数法(即一般计数法) |
ios_base::scientific | 使用科学计数法 | |
ios_base::adjustfield | ios_base::left | 左对齐 |
ios_base::right | 右对齐 | |
ios_base::internal | 符号或基数前缀左对齐,值右对 |
在C++标准中,定点表示法和科学表示法都有下面两个特征:
精度指的是小数位数, 而不是总位数:
显示末尾的0。
调用setf()的效果可以通过unsetf()消除,后者的原型为:
void unsetf(fmtflags mask);
其中,mask是位模式,mask中所有的为都设置为1,将使得对应的位被复位。
您可能注意到了,没有专门指示浮点数默认显示模式的标记,系统的工作原理如下:仅当只有定点位被设置时使用定点表示法;仅当只有科学位被设置时使用科学表示法;
对于其他组合,如没有位被设置或两位都被设置时,将使用默认模式。因此,启用默认模式的方法之如下:
cout.setf(0, ios_base::floatfield);
第二个参数关闭这两位,而第一个参数不设置任何位。一种实现同样目标的简捷方式是,使用参数is:floatfield来调用函数unsetf( ):
cout .unsetf (ios_ base: :floatfield);
如果已知cout处于定点状态,则可以使用参数ios_base:fixed 调用函数unsetf( )来切换到默认模式;然而,无论cout的当前状态如何,使用参数ios_base:floatfield 调用函数unsetf( )
都将切换到默认模式,因此这是一种更好的选择。
7.标准控制符
如:下面的语句打开左对齐和定点模式:
cout<<left<<fixed;
8.头文件iomanip
C++在头文件iomanip中提供了其他一些控制符,三个最常用的控制符为setprecision()、setfill()、setw(),它们分别用来设置精度、填充字符和字段宽度。
setprecision( )控制符接受一个指定精度的整数参数;
sefill( )控制符接受一个指定填充字符的char参数;
setw( )控制符接受一个指定字段宽度的整数参数。
由于它们都 是控制符,因此可以用cout语句连接起来。这样,setw( )控制符在显示多列值时尤其方便。