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; //輸出字符串
double pi=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,注意數符“+”的位置
return 0;}
運行情況如下:
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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章