C++输入输出流格式控制

1.使用控制符   控制输出格式,可以直接cout<<  控制符   <<数据<<endl;
控制符作用
dec设置整数的基数为10
hex设置整数的基数为16
oct设置 整数的基数为8
setbase(n)设置整数的基数为n(n只能是16,10,8之一)
setfill(c)设置填充字符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.用流对象的成员   控制输出格式,如cout.setf(格式状态)<<数据<<endl;

流成员函数与之作用相同的控制符作用
precision(n)setprecision(n)设置实 数的精度为n位。
width(n)setw(n)设置字段宽度为n位。
fill(c)setfill(c)设置填充字符c。
setf( )setiosflags( )设置输出格式状态,括号中应给出格式状态,内容与控制符setiosflags括号中内容相同。
unsetf( )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

以小数形式,保留三位小数输出: 
cout<<setprecision(3)<<setiosflags(ios::fixed)<<3.1415926<<endl;   //输出结果为 0x1.922p+1

使用这些格式需要声明包含<iomainip>

long flags( ) const 返回当前的格式标志。 
long flays(long newflag) 设置格式标志为newflag,返回旧的格式标志。 
long setf(long bits) 设置指定的格式标志位,返回旧的格式标志。 
long setf(long bits,long field)将field指定的格式标志位置为bits,返回旧的格式标志 
long unsetf(long bits) 清除bits指定的格式标志位,返回旧的格式标志。 
long fill(char c) 设置填充字符,缺省条件下是空格。 
char fill( ) 返回当前填充字符。 
int precision(int val) 设置精确度为val,控制输出浮点数的有效位,返回旧值。 
int precision( ) 返回旧的精确度值。 
int width(int val) 设置显示数据的宽度(域宽),返回旧的域宽。 
int width( )只返回当前域宽,缺省宽度为0。这时插入操作能按表示数据的最小宽度显示数据 
dec 十进制的输入输出 
hex 十六进制的输入输出 
oct 八进制的输入输出 
ws 提取空白字符 
flush 刷新流 
resetiosflags(long) 请除特定的格式标志位 
setiosflags(long) 设置特定的格式标志位 
setfill(char) 设置填充字符 
setprecision(int) 设置输出浮点数的精确度 

setw(int) 设置域宽格式变量 


C++输出流的格式控制setw()、setfill()、setbase()、setprecision()、tellp...

 

inline SMANIP(long)     resetiosflags(long _l) { return SMANIP(long)(__resetiosflags, _l); }
inline SMANIP(int)      setfill(int _m) {return SMANIP(int)(__setfill, _m); }
inline SMANIP(long)     setiosflags(long _l) {return SMANIP(long)(__setiosflags, _l); }
inline SMANIP(int)      setprecision(int _p) {return SMANIP(int)(__setprecision, _p); }

inline SMANIP(int)      setw(int _w) { return SMANIP(int)(__setw, _w); } 

//他们都是inline 内联函数


(1)setw(int n) 预设输出宽度
(2)setfill(char c) 预设填充字符

 

如:cout<<setw(6)<<123<<endl;                        //输出结果为“   123”,在123的前面会有3个空格,123右对齐。 

如:cout<<setw(6)<<setfill(‘#’)<<123<<endl;   //输出显示结果为“###123”,123右对齐,在前面填充3个’#’ 。
如:cout<<setfill(‘#’)<<setw(6)<<123<<endl;   //输出显示结果为“###123”,123右对齐,在前面填充3个’#’ 。 
后两个例子显示的结果一致,说明setw()和setfill()可以交换位置。 

 

(3)setbase(int n) 预设整数输出进制

 下面三行,都是以八进制输出的。思考为什么;

如:cout<<setbase(8)<<255<<endl;                //输出显示结果为377
      cout<<oct <<255<< endl; 
      cout<<255; 

 

(4)setprecision(int n) 用于控制输出流显示浮点数的精度,整数n代表显示的浮点数数字的个数。

示例程序1如下: 

#include <iostream>
#include <iomanip> //格式控制

using namespace std;

void main()
{
	double amount = 22.0/7;
	cout <<amount <<endl; 	//(1)输出数值之前没有设置有效位数,所以用流的有效位数默认设置值6,结果为3.14286

    cout<<setprecision(0) <<amount <<endl  	//(2)setprecision(0),gcc则还安照默认的有效数位对待,输出3.14286
		<<setprecision(1) <<amount <<endl   //(3)3
		<<setprecision(2) <<amount <<endl   //(4)3.1
		<<setprecision(3) <<amount <<endl   //(5)3.14
		<<setprecision(4) <<amount <<endl;  //(6)3.143

    cout <<setiosflags(ios::fixed);                    	//设置浮点数以固定的小数位数显示
    cout <<setprecision(8) <<amount <<endl; 			
    cout <<setiosflags(ios::scientific)<<amount<<endl; 	//用setiosflags(ios::scientific)来表示指数表示的输出形式。
														//其有效位数沿用上次的设置值8。
    cout <<setprecision(6);
    system("pause"); 
}

输出的结果如下: 

3.14286

3.14286   //setprecision(0)gcc则还安照默认的有效数位对待,输出3.14286

3

3.1

3.14

3.143

3.14285714

0x1.92492492p+1      ??为什么是十六进制呢,难道p是十六进制的标志?

请按任意键继续. . .

第7行输出setiosflags(ios::fixed),所以setprecision(8)设置的是小数点后面的位数,而非全部数字个数。
第8行输出用setiosflags(ios::scientific)来表示指数表示的输出形式。其有效位数沿用上次的设置值8。在用指数形式输出时,setprecision(n)表示小数位数。 
 


示例程序2如下:

#include<iostream>
#include <iomanip> //格式控制

using   namespace  std;   

void main()
{
	double f=2.0/3.0 ,  f1=0.000000001 ,  f2=-9.9;
	cout<<f<<' '<<f1<<' '<<f2<<endl;      //正常输出0.666667     1e-009     -9.9
	
	cout.setf(ios::showpos);         	//强制在正数前加+号-号  ;可以用cout<<setiosflags(ios::showpos);替代
	cout<<f<<' '<<f1<<' '<<f2<<endl;    //+0.666667    +1e-009   -9.9
	cout.unsetf(ios::showpos);          //取消正数前加+号 ;可以用cout<<resetiosflags(ios::showpos);替代

	cout.setf(ios::showpoint);          //强制显示小数点后的无效0 ;可以用cout<<setiosflags(ios::showpoint); 代替
	cout<<f<<' '<<f1<<' '<<f2<<endl;
	cout.unsetf(ios::showpoint);        //取消显示小数点后的无效0 ;可以用cout<<resetiosflags(ios::showpoint); 代替

	cout.setf(ios::scientific);         //科学记数法。可以用cout<<setiosflags(ios::scientific);  替代
	cout<<f<<' '<<f1<<' '<<f2<<endl; 
	cout.unsetf(ios::scientific);       //取消科学记数法。可以用cout<<resetiosflags(ios::scientific);  代替

	cout.setf(ios::fixed);              //按点输出显示,可以用cout<<setiosflags(ios::fixed);代替
	cout<<f<<' '<<f1<<' '<<f2<<endl;
	cout.unsetf(ios::fixed);            //取消按点输出显示,可以用cout<<resetiosflags(ios::fixed);代替

	cout.precision(18);                 //精度为18,默认精度为6
	cout<<f<<' '<<f1<<' '<<f2<<endl;
	cout.precision(6);                  //精度恢复为6

	system("pause"); 
} 

输出的结果:

0.666667     1e-009     -9.9

+0.666667       +1e-009      -9.9

0.666667     1.00000e-009       -9.90000

6.666667e-001       1.000000e-009       -9.900000e+000

0.666667 0.000000 -9.900000

0.66666666666666663 1.0000000000000001e-009 -9.9000000000000004

请按任意键继续. . . 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值