c++中输入输出流的格式控制符

1.使用控制符控制输出格式

控制符  作用 
dec 
设置整数的基数为10 
hex 
设置整数的基数为16 
oct 
设置整数的基数为8 
setbase(n) 
设置整数的基数为n(n只能是16,10,8之一) 
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::shipws) 
忽略前导的空格。 
setiosflags(ios::uppercase) 
在以科学计数法输出E和十六进制输出字母X时,以大写表示。 
setiosflags(ios::showpos) 
输出正数时,给出“+”号。 
resetiosflags 
终止已设置的输出格式状态,在括号中应指定内容。 

2.用流对象的成员控制输出格式

流成员函数  与之作用相同的控制符 作用 
precision(n) 
setprecision(n) 设置实数的精度为n位。 
width(n) 
setw(n) 设置字段宽度为n位。 
fill(c) 
setfill(c) 设置填充字符c。 
setf( ) 
setiosflags( ) 设置输出格式状态,括号中应给出格式状态,内容与控制符setiosflags括号中内容相同。 
ubsetf( ) 
resetiosflags( ) 终止已设置的输出格式状态。 

cout.width(10);
cout.setf(ios::hex);

3.设置格式状态的格式标志

格式标志  作用 
ios::left 
输出数据在本域宽范围内左对齐 
ios::right 
输出数据在本域宽范围内右对齐 
ios::internal 
数值的符号位在域宽内左对齐,数值右对齐,中间由填充字符填充 
ios::dec 
设置整数的基数为10 
ios::oct 
设置整数的基数为8 
ios::hex 
设置整数的基数为16 
ios::showbase 
强制输出整数的基数(八进制以0打头,十六进制以0x打头) 
ios::showpoint 
强制输出浮点数的小点和尾数0 
ios::uppercase 
在以科学计数法输出E和十六进制输出字母X时,以大写表示 
ios::showpos 
输出正数时,给出“+”号。 
ios::scientific 
设置浮点数以科学计数法(即指数形式)显示 
ios::fixed 
设置浮点数以固定的小数位数显示 
ios::unitbuf 
每次输出后刷新所有流 
ios::stdio 
每次输出后清除stdout,stderr 

 

#include <iostream>
using namespace std;
int main()
 
int a=21;
 
  cout.setf(ios::showbase);//设置输出时的基数符号
 
  cout<<"dec:"<<a<<endl;//默认以十进制形式输出a
 
  cout.unsetf(ios::dec);//终止十进制的格式设置
 
  cout.setf(ios::hex);//设置以十六进制输出的状态
 
  cout<<"hex:"<<a<<endl;//以十六进制形式输出a
 
  cout.unsetf(ios::hex);//终止十六进制的格式设置
 
  cout.setf(ios::oct);//设置以八进制输出的状态
 
  cout<<"oct:"<<a<<endl;//以八进制形式输出a
 
  cout.unsetf(ios::oct);//终止以八进制的输出格式设置
 
  char*pt="China"; //pt指向字符串”china”
 
  cout.width(10);//指定域宽为10
 
  cout<<pt<<endl;//输出字符串
 
  cout.width(10);//指定域宽为10
 
  cout.fill('*');//指定空白处以'*'填充
 
  cout<<pt<<endl;//输出字符串
 
  doublepi=22.0/7.0; //计算pi值
 
  cout.setf(ios::scientific);//指定用科学记数法输出
 
  cout<<"pi=";//输出"pi="
 
  cout.width(14);//指定域宽为14
 
  cout<<pi<<endl;//输出"pi值
 
  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;//输出pi,注意数符“+”的位置
 
  return0;}
运行情况如下:
 
   dec:21(十进制形式)
 
   hex:Oxl5(十六进制形式,以0x开头)
 
   oct:025(八进制形式,以O开头)
 
   China(域宽为10)
 
   *****china(域宽为10,空白处以'*'填充)
 
   pi=**3.142857e+00(指数形式输出,域宽14,默认6位小数)
 
   ****3.142857(小数形式输㈩,精度为6,最左侧输出数符“+”)
 

说明:
1、成员函数width(n)和控制符setw(n)只对其后的第一个输出项有效。如果要求在输出数据时都按指定的同一域宽n输出,不能只调用一次width(n),而必须在输出每一项前都调用一次width(n)。
2、在表5中的输出格式状态分为5组,每一组中同时只能选用一种(例如,dec,hex和oct中只能选一,它们是互相排斥的),在用成员函数serf和控制符setiosflags设置输出格式状态后,如果想改设置为同组的另一状态,应当调用成员函数unsetf(对应于成员函数serf)或resetiosflags(对应于控制符sefiosflags),先终止原来设置的状态。然后再设置其他状态。
同理,程序倒数第8行的unsetf函数的调用也是不可缺少的。读者不妨上机试一试。
3、用serf函数设置格式状态时,可以包含两个或多个格式标志,由于这些格式标志在lOS类中被定义为枚举值,每一个格式标志以一个二进位代表,因此可以用“位或”运算符“I”组合多个格式标志
4、可以看到:对输出格式的控制,既可以用控制符(如例2),也可以用cout流的有关成员函数(如例3),二者的作用是相同的。控制符是在头文件mmamp中定义的,因此用控制符时,必须包含iomanip头文件。cout流的成员函数是在头文件iostream中定义的,因此只需包含头文件iostream,不必包含iomanip。许多程序人员感到使用控制符方便简单,可以在一个cout输出语句中连续使用多种控制符。
5、关于输山格式的控制,在使用中还会遇到一些细节问题,不可能在这里全部涉及。在遇到问题时,请查阅专门手册或上机试验一下即可解决。


以小数形式,保留三位小数输出:
cout<<setprecision(3)<<setiosflags(ios::fixed)<<3.1415926<<endl;
 

//<iomanip>在使用流操纵算子时使用 
 
03.//using namespace std; 
 
04. 

05.//以下所有的setf()都有对应的unsetf()用于取消设置 
 
06.//所有的setiosflags()可以用resetiosflags()取消 
 
07.//标志位fmtflags的命名空间可以使用ios_base::或者ios:: 
 
08. 

09.int laneri = 12345; 
 
10.double lanerd = 56789; 
 
11. 

12.//1、设置整数进制输出 
 
13.//重载1:fmtflags ios_base::setf(fmtflags_Mask); 
 
14.//重载2:fmtflags ios_base::setf(fmtflags _Mask, fmtflags_Unset); 
 
15.//使用重载1的时候,一定要先取消当前基,之后才可以设置新的基 
 
16.//使用重载2的时候,第二个参数设为当前的基,或者当不知道当前基时,设为ios_base::basefield清除当前的所有可能的基 
 
17.//可使用的标志:ios::dec, ios::oct, ios::hex, ios::basefield(=dec|oct|hex) 
 
18.cout.unsetf(ios::dec); 
 //等价1  
19.cout.setf(ios::hex); 
 
20.cout.setf(ios::hex, ios_base::basefield);//等价2 
 
21.cout<<laneri<<endl; 
 
22.cout<<setiosflags(ios::hex)<<laneri<<endl;//等价3 
 
23.cout<<std::hex<<laneri<<endl; 
 //等价4  
24.//使用输入输出操纵符也能有等价效果(命名空间使用std::,否则会有多余的字符),注意这种方法其实不止对本句生效 
 
25. 

26.//2、 显示进制前导字符(0、0x) 
 
27.cout.setf(ios::showbase); 
 
28.cout<<setiosflags(ios::showbase)<<laneri<<endl; 
 
29.cout<<std::showbase<<laneri<<endl; 
 
30. 

31.//3、使用科学记数法 
 
32.//只对数据类型为小数的变量有效(或者字面值是小数) 
 
33.//对precision有影响(详见precision的说明) 
 
34.//对ios::fixed有影响(详见fixed的说明),但不会被fixed影响 
 
35.cout.setf(ios::scientific); 
 
36.cout<<lanerd<<endl; 
 
37.cout<<setiosflags(ios::scientific)<<lanerd<<endl; 
 
38.cout<<std::scientific<<lanerd<<endl; 
 
39. 

40.//4、设置小数的浮点/定点显示方式 
 
41.//主要依靠precision体现(详见precision的说明) 
 
42.//当设置了ios::scientific标志时,ios::fixed会受到影响,std::fixed不会 
 
43.cout.setf(ios::fixed); 
  
44.cout<<lanerd<<endl; 
 
45.cout<<setiosflags(ios::fixed)<<lanerd<<endl; 
  
46.cout<<std::fixed<<lanerd<<endl; 
  
47. 

48.//5、设置小数数据类型的显示精度,受到scientific和fixed的影响 
 
49.//当设置(fixed |scientific)时,precision(n)表示小数点后固定显示n位小数 
 
50.//当不设置(fixed &scientific)时,precision(n)表示固定显示n位数字 
 
51.//其中,当是整数且位数m小于n,而又没有设置showpoint的时候,只显示m位整数。例如:precision(3),12->12 
 
52.//其中,当是整数且位数p大于n,无论设置showpoint与否,都四舍五入后使用科学计数法。例如:precision(3),1234->1.23e+003 
 
53.cout.precision(3); 
 
54.cout<<lanerd<<endl; 
 
55.cout<<setprecision(3)<<3.1415926<<endl; 
 
56. 
   
57.//6、强制浮点数类型变量的小数点显示 
 
58.//如果是整数,大于precision宽度时使用科学计数法,小于precision则小数点后面补0,等于precision时显示小数点但无小数 
 
59.//例:不设fixed,precision(6):1234567->1.23457E+006; 
 12345->12345.0;   123456->123456.  
60.//  设fixed,precision(6): 1234567->1234567.000000;12345->12345.000000;123456->123456.000000 
 
61.cout.setf(ios::showpoint); 
 
62.cout<<setiosflags(ios::showpoint)<<lanerd<<endl; 
 
63.cout<<std::showpoint<<lanerd<<endl; 
 
64. 

65.//7、设置屏幕上的最小显示宽度 
 
66.//实际字符数大于等于这个数字,显示全部;小于这个数字,用fill()设置的字符来填充其他占位符 
 
67.//注意:宽度设置只对下一个"<<"输出有效 
 
68.//例如:cout<<setw(10)<<right<<"laner"<<"linke";只有"laner"是占10个字符,linke不是 
 
69.cout.width(12); 
 
70.cout<<setw(12)<<3.14<<endl; 
 
71. 

72.//8、显示对齐方式,默认为左对齐 
 
73.cout.setf(ios::right); 
 
74.cout<<setiosflags(ios::right)<<laneri<<endl; 
 
75.cout<<std::right<<6.28<<endl; 
 
76. 

77.//9、设置不足显示宽度时的填充字符,默认为'' 
 
78.cout.fill('*'); 
 
79.cout<<setfill('$')<<laneri<<endl; 

你可能感兴趣的:(c++中输入输出流的格式控制符)