的程序用成员函数setf设置showpoint标志,从而控制了浮点数的尾数零和小数点的输出。 i // Fig. 3.21: fig11_21.cpp
2 // Controlling the printing of trailing zeros and decimal 3 // points for floating-point values. 4 #include
8 int main() 9 {
10 cout << \11 << \12 << \13 << \
14 << \15 cout.setf( ios::showpoint );
16 cout << \17 << \
18 << \19 return 0; 2O }
输出结果:
Before setting the ios::showpolnt flag 9.9900 prints as: 9.99 9.9000 prints as: 9.9 9.9000 prints as: 9
After setting the ios::showpoint flag 9.9900 prints as: 9.99000 9.9000 prints as: 9.90000 9.0000 prints as: 9.00000
图 3.21 控制浮点数的尾数零和小数点的输出
3.7.3 对齐(ios::left、ios::right、ios::internal)
left标志可以使输出域左对齐并把填充字符放在输出数据的右边,right标志可以使输出域右对齐并把填充字符放在输出数据的左边。填充的字符由成员函数fill或参数化的流操纵算子setfill指定。图3.22用流操纵算子setw、setiosflags、reseticsfiags以及成员函数serf和unsetf控制整数值在域宽内左对齐和右对齐。 1 // Fig. 3.22: fig11_22.cpp
2 // Left-justification and right-justification.
-51-
3 #include
8 int x = 12345; 9
10 cout << \
11 << setw(10) << x << \12 << \13
14 cout.setf( ios::left, ios::adjustfield );
15 cout << x << \16 cout.unsetf( ios::left ); 17 cout << setw( 10 ) << x
18 << \TORS\19 << \20 << setw( 10 ) << setiosflags( ios::left ) << x 21 << \22 << setw( 10 ) << resetiosflags( ios::left ) 23 << x << endl; 24 return 0; 25 }
输出结果:
Default is right justified: 12345
USING MEMBER FUNCTIONS Use setf to set ios::left: 12345
Use unsetf to restore default: 12345
USING PARAMETERIZED STREAM MANIPULATORS Use setiosflags to set ios::left: 12345
Use resetiosflags to restore default: 12345
图 3.22 左对齐和右对齐
internal标志指示将一个数的符号位(设置了ios::showbase标志时为基数,见3.7.5节)在域宽内左对齐,数值右对齐,中间的空白由填充字符填充。left、right和internal标志包含在静态数据成员ios::adjustfield中。在设置left、right和internal对齐标志时,setf的第二个参数必须是ios::adjustfield,这样才能使serf只设置其中一个标志(这三个标志是互斥的)。图3.23中的程序用流操纵算子setiosflags和setw指定中间的空白。注意,ios::showpos标志强制打印了加号。
-52-
1 // Fig. 3.23: figll_23.cpp
2 // Printing an integer with internal spacing and 3 // forcing the plus sign. 4 #include
7 int main() 8 {
9 cout << setiosflags( ios::internal | ios::showpos ) 10 << setw( 10 ) << 123 << endl; 11 return O; 12 }
输出结果: + 123
图 3.23 打印中间带空白的整数并强制输出加号
3.7.4 设置填充字符(fill、setfill)
成员函数fill设置用于使输出域对齐的填充字符,如果不特别指定,空格即为填充字符。fill函数返回以前设置的填充字符。图3.24中的程序演示了使用成员函数fill和流操纵算子,setfill来控制填充字符的设置和清除。 1 // Fig. 3.24: fig11_24.cpp
2 // Using the fill member function and the setfill 3 // manipulator to change the padding character for 4 // fields larger than the values being printed. 5 #include
8 int main() 9 {
10 int x = 10000; 11
12 cout << x << \13 << \14 << \15 cout.setf( ios::showbase );
16 cout << setw( 10 ) << x << '\\n'; 17 cout.setf( ios::left, ios::adjustfield ); 18 cout << setw( 10 } << x << '\\n';
19 cout.serf( ios::internal, ios::adjustfield ); 20 cout << setw( 10 ) << hex << x;
-53-
21
22 cout << \23 cout.setf( ios::right, ios::adjustfield ); 24 cout.fill( '*' );
25 cout << setw( 10 ) << dec << x << '\\n'; 26 cout.setf( ios::left, ios::adjustfield );
27 cout << setw( 10 ) << setfill( '%' ) << x << '\\n'; 28 cout.setf( ios::internal, ios::adjustfield );
29 cout << setw( 10 ) << setfill( '^' ) << hex << x << endl; 30 return 0; 31 }
输出结果:
10000 printed as int right and left justified and as hex with internal justification. Using the default pad character (space): l0000 10000
0x2710
Using various padding characters: *****10000 10000%%%%%
图 3.24 用fill和setfill为实际宽度小于域宽的数据改变填充字符
3.7.5 整数流的基数:(ios::dec、ios::oct、ios::hex、ios::showbase)
静态成员ios::basefield(在setf中的用法与ios::adjustfield类似)包括ios::oct、ios::hex和ios::dec标志位,这些标志位分别指定把整数作为八进制、十六进制和十进制值处理。如果没有设置这些位,则流插入运算默认整数为十进制数,流读取运算按整数提供的方式处理数据(即以零打头的整数按八进制数处理,以0x或0X打头的按十六进制数处理,其他所有整数都按十进制数处理)。一旦为流指定了特定的基数,流中的所有整数都按该基数处理,直到指定了新的基数或程序结束为止。
设置showbase标志可强制输出整数值的基数。十进制数以通常方式输出,输出的八进制数以0打头,输出的十六进制数以0x或0X打头(由uppercase标志决定是0x还是0X,见3.7.7节)。图3.25中的程序用showbase标志强制整数按十进制、八进制和十六进制格式打印。 1 // Fig. 3.25: figll_25.cpp
2 // Using the ios::showbase flag 3 #include
-54-
6 int main() 7 {
8 int x = 100; 9
10 cout << setiosflags( ios::showbase )
11 << \12 << x << '\\n'
13 << oct << x << '\\n' 14 << hex << x << endl; 15 return 0; 16 }
输入结果:
Printing integers preceded by their base: I00 0144 0x64
图 3.25 使用ios::showbase标志
3.7.6 浮点数和科学记数法(ios::scientific、ios::fixed)
ios::scientific和ios::fixed标志包含在静态数据成员ios::floatfield中(在setf中的用法与ios:: adjustfield和ios::basefield类似)。这些标志用于控制浮点数的输出格式。设置scientific标志使浮点数按科学记数法输出,设置fixed标志使浮点数按照定点格式输出,即显示出小数点,小数点后边
有指定的位数(由成员函数precision指定)。若没有这些设置,则浮点数的值决定输出格式。 调用cout.setf(O,ios::floatfield)恢复输出浮点数的系统默认格式。图3.26中的程序示范了以定点格式和科学记数法显示的浮点数。 1 // Fig. 3.26: flg11_26.cpp
2 // Displaying floating-point values in system default, 3 // scientific, and fixed formats. 4 #include
6 int main() 7 {
8 double x = .001239567, y = 1.946e9; 9
10 cout << \11 << x << '\\t' << y << '\\n';
12 cout.setf( ios::scientific, ios::floatfield ); 13 cout << \14 << x << '\\t' << y << '\\n';
-55-