本节书摘来自异步社区出版社《C和C++代码精粹》一书中的第1章,第1.9节,作者: 【美】Chuck Allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.9 格式化
C和C++代码精粹
在程序清单1.8中ios::skipws是一个格式化标志的例子。格式化标志是位掩码值,该位掩码值可以通过成员函数setf来设置,也可用unsetf复位(见表1.1的完整描述)。
程序清单1.9的程序阐述了数字的格式化。标准流成员函数precision用来指定浮点值显示的小数位数。如果没有设置ios::showpoint标志,那么末尾的零不被显示。要用前置加号来打印正数,就用ios::showpos。在上例中想要以16进制形式显示x 和在指数形式中显示大写e,使用ios::uppercase。
程序清单1.7 计算文本文件中的字数
// wc.cpp:显示字的个数
#include <iostream>
using namespace std;
main()
{
const size_t BUFSIZ = 128;
char s[BUFSIZ];
size_t wc = 0;
while (cin >> s)
++wc;
cout << wc << '\n';
}
//从"wc < wc.cpp”命令输出
34
程序清单1.8 与程序copy1.cpp完全相同,但使用提取运算符读取空格
// copy3.cpp :用>>读取空格符
#include <iostream>
using namespace std;
main()
{
char c;
//不要跳过空格符
cin.unsetf(ios::skipws);
while (cin >> c)
cout << c;
}
表1.1 格式化标志
一些格式化选项可以具有一定范围的值。例如,用来确定显示整型数基数的ios::basefield可以被设置成10进制、8进制或16进制。(见表1.2中3种格式化域有效的描述)由于这些是位域而不是单个的位,可用带两个参数形式的setf来设置。例如,程序清单1.10的程序设置8进制数模式采用下面语句:
cout.setf ( ios::oct,ios::basefield );
用标志ios::showbase进行设置时,8进制以0开头,16进制以0x开头打印输出(或者以0X开头打印输出,如果ios::uppercase也被设置)。
程序清单1.9 描述数据格式化
// float.cpp :格式化真正的数字
#include <iostream>
using namespace std;
main()
{
float x = 12345.6789, y = 12345;
cout << x << ' ' << y << '\n';
//显示两个十位数
cout.precision(2);
cout << x << ' ' << y << '\n';
//显示末尾的零
cout.setf(ios::showpoint);
cout << x << ' ' << y << '\n';
//显示符号
cout.setf(ios::showpos);
cout << x << ' ' << y << '\n';
//返回符号和默认值的精度
cout.unsetf(ios::showpos);
cout.precision(0);
//使用科学计数法
cout.setf(ios::scientific,ios::floatfield);
float z = 1234567890.123456;
cout << z << '\n';
cout.setf(ios::uppercase);
cout << z << '\n';
}
//输出:
12345.678711 12345
12345.68 12345
12345.68 12345.00
+12345.68 +12345.00
1.234568e+09
1.234568E+09
表1.2 格式化域
程序清单1.10 显示整数的基数
// base1.cpp :显示整数的基数
#include <iostream>
using namespace std;
main()
{
int x, ![image](https://yqfile.alicdn.com/d4dff4359c675def6e527db1695916fa57198610.png)
y, z;
cout << "输入三个整数: ";
cin >> x >> y >> z;
cout << x << ',' << y << ',' << z << endl;
//在不同基数中打印
cout << x << ',';
cout.setf(ios::oct,ios::basefield);
cout << y << ',';
cout.setf(ios::hex,ios::basefield);
cout << z << endl;
//显示基数前缀
cout.setf(ios::showbase);
cout << x << ',';
cout.setf(ios::oct,ios::basefield);
cout << y << ',';
cout.setf(ios::hex,ios::basefield);
cout << z << endl;
}
//运行结果
输入三个整数:10 010 0x10
10,8,16
10,10,10
0xa,010,0x10
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。