首页 理论教育流的格式控制-《C++程序设计基础教程》

流的格式控制-《C++程序设计基础教程》

【摘要】:表8.2流格式状态标志续表2.设置流格式状态标志的成员函数虽然无法直接对流格式状态标志进行操作,但可以使用ios类提供的公有成员函数来操作这些标志。例如,以下程序用成员函数setf设置ios∷left标志,用unsetf清除ios∷left设置:程序执行结果如下:默认对齐456.23456.23左对齐456.23456.23恢复默认齐456.23456.23采用setiosflags/resetiosflags操纵符是等价的。

在C++中,数据的输入/输出格式控制主要有两种方式:输入/输出流操纵符和流格式状态标志。

采用第一种方式,就是直接使用C++提供的大量流操纵符进行输入/输出的格式控制,如设置域宽、设置精度、设置和清除格式化标志、设置域填充字符等。此方式已在第1章1.2.4小节中介绍,本小节主要介绍第二种方式。

1.格式状态标志

每个C++流都有自己的数据格式状态标志,用于反映该流的当前状态。这些状态用一个长整数表示,即ios类的数据成员x_flags。表8.2列出了流格式状态标志在类ios中被定义的枚举值,从中可以看到,数据成员x_flags的每个位表示一个状态标志设置。

表8.2 流格式状态标志

续表

2.设置流格式状态标志的成员函数

虽然无法直接对流格式状态标志进行操作,但可以使用ios类提供的公有成员函数来操作这些标志。

(1)setf()

成员函数setf()用于设置流格式状态标志。例如,设置输出流cout的showbase标志使用如下语句:

cout.setf(ios∷showbase);

设置输入流cin的skipws标志使用如下语句:

cin.setf(ios∷skipws);

注意:格式标志前的限定“ios∷”不可缺少,因为这些标志是在ios类中定义的。

在setf()中还可用位或操作符“|”将多个标志连在一起。例如:

cout.setf(ios∷scientific|ios∷showpoint);

同时设置scientific和showpoint两个标志。

(2)unsetf()

成员函数unsetf()用来清除流格式状态标志。unsetf()的用法与setf()相似。

(3)flags()

成员函数flags()用于返回流格式状态标志的当前设置。例如,以下语句返回当前cout流的ios∷scientific|ios∷showpos结果:

cout<<cout.flags(ios∷scientific|ios∷showpos)<<endl;

(4)fill()

成员函数fill()设置用于使输出域对齐的填充字符,如果不特别指定,空格即为填充字符,也可以使用流操纵符setfill达到同样的功能。例如,以下语句设置填充字符为'*'。

cout.fill('*');

3.设置流格式状态标志的操纵符

在第1章表1.4中列出的C++流操纵符,其中setiosflags用于设置流格式状态标志中指定的标志位,resetiosflags用于清除流格式状态标志中指定的标志位。例如,以下语句以十六进制输出108,结果为6C:

cout<<setiosflags(ios∷uppercase)<<hex<<108<<endl;

4.尾数零和十进制小数点(ios∷showpoint)

设置showpoint标志是为了强制输出浮点数的小数点和尾数零。若没有设置showpoint,浮点数15.0将被打印为15,否则打印为15.000000(或由当前精度指定的尾数零的个数)。

例如,以下程序用成员函数setf设置showpoint标志,从而控制了浮点数的尾数零和小数点的输出:

程序的执行结果如下:

设置ios∷showpoint标志之前:

5.5500:5.55

5.5000:5.5

5.0000:5

设置ios∷showpoint标志之后:

5.5500:5.55000(www.chuimin.cn)

5.5000:5.50000

5.0000:5.00000

采用setiosflags操纵符是等价的。

5.对齐(ios∷left、ios∷right)

left标志可以使输出域左对齐,把填充字符放在输出数据的右边;right标志可以使输出域右对齐,把填充字符放在输出数据的左边。填充的字符由fill()函数或流操纵符setfill指定。例如,以下程序用成员函数setf设置ios∷left标志,用unsetf清除ios∷left设置:

程序执行结果如下:

默认对齐

  456.23

 456.23

左对齐

456.23

456.23

恢复默认齐

  456.23

 456.23

采用setiosflags/resetiosflags操纵符是等价的。

6.整数流的基数(ios∷dec、ios∷oct、ios∷hex、ios∷showbase)

ios∷oct、ios∷hex和ios∷dec标志位分别指定把整数作为八进制、十六进制和十进制值处理。如果没有设置这些位,则流插入运算默认整数为十进制数,流读取运算按整数提供的方式处理数据(即以零打头的整数按八进制数处理,以0x或0X打头的按十六进制数处理,其他所有整数都按十进制数处理)。

设置showbase标志可强制输出整数值的基数。十进制数以通常方式输出,输出的八进制数以0打头,输出的十六进制数以0x或0X打头(由uppercase标志决定是0x还是0X)。例如,以下程序用成员函数setf设置showbase标志,并强制整数按十进制、八进制和十六进制格式输出:

程序的执行结果如下:

100

0144

0x64

采用setiosflags操纵符,等价的程序如下:

7.定点格式和科学记数法(ios∷scientific、ios∷fixed)

ios∷scientific和ios∷fixed标志用于控制浮点数的输出格式。scientific标志使浮点数按科学记数法输出,fixed标志使浮点数按照定点格式输出,即显示出小数点,小数点后边有指定的位数(由precision()函数指定)。若没有这些设置,则浮点数的值决定输出格式。例如,以下程序用成员函数setf设置定点格式和科学记数法格式,用unsetf恢复默认格式:

程序的执行结果如下:

默认格式

a=0.654321,b=6.54321e+006

科学记数法

a=6.54321e-001,b=6.543210e+006

恢复默认格式

a=0.654321,b=6.54321e+006

定点格式

a=0.654321,b=6543210.000000

采用setiosflags/resetiosflags操纵符,等价的程序如下: