1.修改显示时使用的计数系统
ostream类是从ios类派生来的,而后者是从ios_base派生来的。ios_base类存储了描述格式状态的信息。例如,一个类成员中某些位决定了使用的计数系统,而另一个成员则决定了字段宽度。通过使用控制符,可以控制显示整数时使用的计数系统。通过使用ios_base的成员函数,可以控制字段的宽度和小数位数。
要控制整数以十进制、十六进制、八进制显示,可以使用dec、hex和oct控制符。
例如:
#include <iostream>
int main()
{
using namespace std;
cout<<"Enter an integer: ";
int n;
cin>>n;
cout<<"n n*n\n";//默认输出
cout<<n<<" "<<n*n<<"(decimal)\n";
cout<<hex;//十六进制输出
cout<<n<<" "<<n*n<<"(hexadecimal)\n";
cout<<oct<<n<<" "<<n*n<<"(octal)\n";//八进制输出
dec(cout);//十进制输出
cout<<n<<" "<<n*n<<"(decimal)\n";
return 0;
}
2.调整字符宽度
cout.width(int);
注意:width( )方法只影响接下来显示的一个项目,然后字段宽度将恢复为默认值
3.填充字符
cout.fill('*');//用 * 来填充字段中未被使用的部分
注意:与字段宽度不同的是,新的填充字符将一直有效,直到更改它为止。
4.设置浮点数的显示精度
cout.precision(5);//设置精度为5
5.打印末尾的0和小数点
cout.setf(ios_base::showpoint);
setf( )是ios_base类中的一个格式化函数,setf( )有两个原型。第一个为:
fmtflags setf(fmtflags);
其中,fmtflags是bitmask类型的typedef名,用于存储格式标记。这个版本的setf( )是用来设置单位控制的格式信息。
有下面一些格式常量:
ios_base::boolalpha 输入和输出bool值,可以为true或false
ios_base::showbase 对于输出,使用C++基数前缀(O,Ox)
ios_base::showpoint 显示末尾的小数点
ios_base::uppercase 对于16进制输出,使用大写字母,E表示法
ios_base::showpos 在正数前面加上+
第二个setf( )原型接受两个参数,并返回以前的设置:
fmtflags setf(fmtflags, fmtflags);
函数的这种重载格式用于设置由多位控制的格式选项。第一个参数和以前一样,也是包含了所需设置的fmtflags值,第二个参数指出要清楚第一个参数中的哪些位。
setf(long, long)的参数
看下面的例子:
#include <iostream>
#include <cmath>
int main()
{
using namespace std;
cout.setf(ios_base::left,ios_base::adjustfield);//左对齐
cout.setf(ios_base::showpos);//在正数前面加上+
cout.setf(ios_base::showpoint);//显示末尾的小数点
cout.precision(3);//精度为3
ios_base::fmtflags old = cout.setf(ios_base::scientific,ios_base::floatfield);
cout<<"Left Justification:\n";
long n;
for(n = 1; n <= 41; n += 10)
{
cout.width(4);//字段宽度为4
cout<<n<<"|";
cout.width(12);//字段宽度为12
cout<<sqrt(double(n))<<"|\n";
}
cout.setf(ios_base::internal,ios_base::adjustfield);//符号或基数前缀左对齐,值右对齐
cout.setf(old,ios_base::floatfield);//恢复以前的格式设置
cout<<"Internal Justification:\n";
for(n = 1; n <= 41; n += 10)
{
cout.width(4);
cout<<n<<"|";
cout.width(12);
cout<<sqrt(double(n))<<"|\n";
}
cout.setf(ios_base::right,ios_base::adjustfield);//右对齐
cout.setf(ios_base::fixed,ios_base::floatfield);//使用定点计数法
cout<<"Right Justification:\n";
for(n = 1; n <= 41; n += 10)
{
cout.width(4);
cout<<n<<"|";
cout.width(12);
cout<<sqrt(double(n))<<"|\n";
}
return 0;
}
输出结果为:
Left Justification:
+1 |+1.000e+000 |
+11 |+3.317e+000 |
+21 |+4.583e+000 |
+31 |+5.568e+000 |
+41 |+6.403e+000 |
Internal Justification:
+ 1|+ 1.00|
+ 11|+ 3.32|
+ 21|+ 4.58|
+ 31|+ 5.57|
+ 41|+ 6.40|
Right Justification:
+1| +1.000|
+11| +3.317|
+21| +4.583|
+31| +5.568|
+41| +6.403|