通常为简便起见,往往不指定输出的格式,由系统根据数据的类型采取默认的格式,但有时希望数据按指定的格式输出。有两种方法可以取实现它,一种是使用控制符的方法,另外一种是使用流对象的有关成员函数。
1.使用控制符控制输出格式
控制符 | 作用 |
dec | 设置整数的基数为10 |
hex | 设置整数的基数为16 |
oct | 设置整数的基数为8 |
setbase(n) | 设置整数的基数为n(n只能是8,10,16三者之一) |
setfill(c) | 设置填充字符c,c可以是字符常量或字符变量 |
setprecision(n) | 设置实数的精度为n位。在以一般十进制小数形式输出时n代表有效数字。在以fixed形式和scientific形式输出时n为小数位数 |
setw(n) | 设置字段宽度位n位 |
setiosflags(ios::fixed) | 设置浮点数以固定的小数位数显示 |
setiosflags(ios::scientific) | 设置浮点数以科学计数法(即指数形式)显示 |
setiosflags(ios::left) | 输出数据左对齐 |
setiosflags(ios::right) | 输出数据右对齐 |
setiosflags(ios::skipws) | 忽略前导的空格 |
setiosflags(ios::uppercase) | 在以科学记数法输出E和以十六进制输出字母X时以大写表示 |
setiosflags(ios::showpos) | 输出正数时给出“+“号 |
resetioflags() | 终止已设置的输出格式状态,在括号中应指定内容 |
注意:这些控制符在头文件iomanip中定义的,因而程序中应当包含头文件iomanip。
例1.用控制符控制输出格式
#include<iostream>
#include<iomanip> //不要忘记包含此头文件
using namespace std;
int main()
{
int a;
cout<<"input a:";
cin>>a;
cout<<"dec:"<<dec<<a<<endl; //以十进制形式输出整数a
cout<<"hex:"<<hex<<a<<endl; //以十六进制形式输出整数a
cout<<"oct:"<<oct<<a<<endl; //以八进制形式输出整数a
char *pt="China";
cout<<setw(10)<<pt<<endl; //指定域宽10,输出字符串
cout<<setfill('*')<<setw(10)<<pt<<endl; //以*填充
double pi=22.0/7.0;
cout<<setiosflags(ios::scientific)<<setprecision(8); //按指数形式输出,8位小数
cout<<"pi="<<pi<<endl;
cout<<"pi="<<setprecision(4)<<pi<<endl;
return 0;
}
运行结果如下:
2.用流对象的成员函数控制输出格式
还可以通过调用流对象cout中用于控制输出格式的成员函数来控制输出格式。
用于控制输出格式的常用成员函数如下表所示:
流成员函数 | 与之作用相同的控制符 | 作用 |
precision(n) | setprecision(n) | 设置实数的精度为n位 |
width(n) | setw(n) | 设置字段宽度位n位 |
fill(c) | setfill(c) | 设置填充字符c |
setf() | setiosflags() | 设置输出格式状态,括号中应给出格式状态 |
unsetf() | resetioflags() | 终止已设置的输出格式状态 |
设置格式状态的格式标志:
格式标志 | 作用 |
ios::left | 输出数据在本域宽范围内向左对齐 |
ios::right | 输出数据在本域宽范围内向右对齐 |
ios::internal | 数值的符号位在域宽内左对齐,数值右对齐,中间由填充字符填充 |
ios::dec | 设置整数的基数为10 |
ios::oct | 设置整数的基数为8 |
ios::hex | 设置整数的基数为16 |
ios::showbase | 强制输出整数的基数 |
ios::showpoint | 强制输出浮点数的小点和尾数0 |
ios::uppercase | 在以科学计数法格式E和十六进制输出字母时以大写表示 |
ios::showpos | 对正数显示+号 |
ios::scientific | 浮点数以科学计数法格式输出 |
ios::fixed | 浮点数以小数形式输出 |
ios::unitbuf | 每次输出后刷新所有的流 |
ios::stdio | 每次输出后清楚stdout,stderr |
注意:流成员函数setf和控制符setiosflags括号中的参数表示格式状态,它是通过格式标志来指定的。格式标志在类ios中被定义为枚举值。因此在引用这些格式标志时要在前面加上类名ios和域运算符”::”。
例2. 用流控制成员函数输出数据
#include<iostream>
using namespace std;
int main()
{
int a=21;
cout.setf(ios::showbase);
cout<<"dec:"<<a<<endl; //默认以十进制输出
cout.unsetf(ios::dec); //终止十进制的格式设置
cout.setf(ios::hex); //以十六进制形式输出a
cout<<"hex:"<<a<<endl;
cout.unsetf(ios::hex); //终止十六进制的格式设置
cout.setf(ios::oct);
cout<<"oct:"<<a<<endl;
cout.unsetf(ios::oct);
char *pt="China";
cout.width(10); //指定域宽为10
cout<<pt<<endl;
cout.width(10);
cout.fill('*');
cout<<pt<<endl;
double pi=22.0/7.0;
cout.setf(ios::scientific); //指定用科学计数法输出
cout<<"pi=";
cout.width(14);
cout<<pi<<endl;
cout.unsetf(ios::scientific);
cout.setf(ios::fixed); //指定用定点形式输出
cout.width(12); //指定域宽为12
cout.setf(ios::showpos);
cout.setf(ios::internal); //数符出现在左侧
cout.precision(6); //保留6位小数
cout<<pi<<endl;
return 0;
}
运行情况如下: