ostream类方法-飞外

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成员函数将长度不同的数字放到宽度相同的字段中,该方法的原型为:
intwidth();
intwidth(inti);
第一种格式返回字段宽度的当前设置:第二种格式将字段宽度设置为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类定义了代表位值的常量,使用时,必须加上作用域解析运算符。


第二个setf()原型接受两个参数,并返回以前的设置:

fmtflags setf(fmtflags,fmtflags);

函数的这种重载格式用于设置由多位控制的格式选项。第一参数和以前一样,也是一个包含了所需设置的fmtflags值。第二参数指出要清除第一个参数中的哪些位。

setf(long,long)的参数

调用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()控制符在显示多列值时尤其方便。