现在的位置: 首页 > 综合 > 正文

C++格式輸出控制 setiosflags()的激活與取消

2014年09月05日 ⁄ 综合 ⁄ 共 2554字 ⁄ 字号 评论关闭

本人在練習http://hi.baidu.com/hankcs/item/55c0ca55e8f4ac9208be1770一文中的例二《例2
用控制符控制输出格式
》時,
發現在使用setiosflags(ios::scientific)后直接用setiosflags(ios::fixed)來輸出小數形式的浮點數時,結果不正確:pi=0x1.9249p+1 。不知道原因是什麽,

#include <iostream>
#include <iomanip> //不要忘记包含此头文件
using namespace std;
int main()
{ int a;
   cout<<"input a:";
   cin>>a;
   cout<<"dec:"<<dec<<a<<endl; //以上进制形式输出整数
   cout<<"hex:"<<hex<<a<<endl; //以十六进制形式输出整数a
   cout<<"oct:"<<setbase(8)<<a<<endl;//以八进制形式输出整数a
   char *pt="China";         //pt指向字符串”China” 
   cout<<setw(10)<<pt<<endl; //指定域宽为10,输出字符串
   cout<<setfill('*')<<setw(10)<<pt<<endl;//指定域宽10,输出字符串,空白处以“*”填充
   double pi=22.0/7.0; //计算pi值
   cout<<setiosflags(ios::scientific)<<setprecision(8);//按指数形式输出,8位小数
   cout<<"pi="<<pi<<endl; //输出pi值
   cout<<"pi="<<setprecision(4)<<pi<<endl;//改为4位小数
   cout<<"pi="<<setiosflags(ios::fixed)<<pi<<endl;//改为小数形式输出
   return 0;
}

輸出結果為:

input a:455
dec:455
hex:1c7
oct:707
oct:707
hex:1c7
China
*****China
pi=3.14285714e+000
pi=3.1429e+000
pi=0x1.9249p+1
请按任意键继续. . .

有網友認為“可能是因为 fixed和scientific不是互斥的, 你得把先设置的那个取消掉再设置后一个”。參見:

http://zhidao.baidu.com/question/103954904.html&__bd_tkn__=64915c5d3a2499274a6df826f8b575b6d4529fbca52c61810ceff9427de9d4932c67cd34bbba8d6024b87e11a1fbf820ddf422bd29

后將程序修改如下后,正常了:

//C++ 输出格式控制练习
//http://blog.csdn.net/qianfu111/article/details/7020174
#include <iostream>
#include <iomanip> //不要忘记包含此头文件
using namespace std;


int main()
{
	int a;
	cout<<"input a:";
	cin>>a;
	cout<<"dec:"<<dec<<a<<endl;//以上进制形式输出整数
	
	hex(cout);
	cout<<"hex:"<<a<<endl;
	//cout<<"hex:"<<hex<<a<<endl;//以十六进制形式输出整数a

	cout<<"oct:"<<setbase(8)<<a<<endl;//以八进制形式输出整数a
	cout<<"oct:"<<oct<<a<<endl;

	cout<<"hex:"<<hex<<a<<endl;
	

	char *pt="China";         //pt指向字符串”China”
	cout<<setw(10)<<pt<<endl;//指定域宽为10,输出字符串
	cout<<setfill('*')<<setw(10)<<pt<<endl;//指定域宽10,输出字符串,空白处以“*”填充

	double pi=22.0/7.0; //计算pi值
	cout<<setiosflags(ios::scientific)<<setprecision(8);//按指数形式输出,8位小数
	cout<<"按指數形式輸出:"<<endl;
	cout<<"pi="<<pi<<endl; //输出pi值
	cout<<"pi="<<setprecision(4)<<pi<<endl;//改为4位小数
		
	
	//如果注释掉这行,输出结果将是pi=0x1.9249p+1,而不是pi=3.1429
	//大概是因为 fixed和scientific不是互斥的, 你得把先设置的那个取消掉再设置后一个
	cout<<resetiosflags(ios::scientific);
	cout<<"按定點形式輸出:"<<endl;
	cout<<"pi="<<setiosflags(ios::fixed)<<pi<<endl;//改为小数形式输出

	cout<<resetiosflags(ios::fixed);
	cout<<"原位輸出:"<<endl;
	cout<<"pi="<<pi<<endl;
	
	return 0; 
}

輸出結果:

input a:455
dec:455
hex:1c7
oct:707
oct:707
hex:1c7
     China
*****China
按指數形式輸出:
pi=3.14285714e+000
pi=3.1429e+000
按定點形式輸出:
pi=3.1429
原位輸出:
pi=3.143
请按任意键继续. . .

關於這些操作符,可參考以下解釋:

std::resetiosflags

http://www.cplusplus.com/reference/iostream/manipulators/resetiosflags/

std::setiosflags

http://www.cplusplus.com/reference/iostream/manipulators/setiosflags/

其他資料:

http://blog.csdn.net/shuilan0066/article/details/4034142 小数点输出精度控制问题

抱歉!评论已关闭.