在輸出浮點數時,C++默認的流輸出數值有效位是6,所以不管數據是多少都只輸出六位有效數字。可以采用setprecision(n)來控制輸出流顯示浮點數的數字個數。
I/O流常用控制符:
使用控制符時,需要加入頭文件#include<iomanip>。C++有兩種方法控制格式輸出:1、用格式控制符;2、用流對象的成員函數。
使用格式控制符:
控制符 | 作用 |
dec | 設置整數的基數為10 |
hex | 設置整數的基數為16 |
oct | 設置整數的基數為8 |
setbase(n) | 設置整數的基數為n,其中n的取值為8,10,16 |
setfill(c) | 設置填充字符,c可以是字符常量或字符變量 |
setprecision(n) | 設置實數的精度為n位。在以一般十進制形式輸出時,n代表有效數字。在以fixed(固定小數位)形式和scientific(指數)形式輸出時,n為小數位數。 |
setw(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 | 終止已設置的輸出格式狀態,在括號中應指定內容。 |
成員函數:
流成員函數 | 與之作用相同的控制符 | 作用 |
precision(n) | setprecision(n) | 設置實 數的精度為n位。 |
width(n) | setw(n) | 設置字段寬度為n位。 |
fill(c) | setfill(c) | 設置填充字符c。 |
setf( ) | setiosflags( ) | 設置輸出格式狀態,括號中應給出格式狀態,內容與控制符setiosflags括號中內容相同。 |
ubsetf( ) | resetiosflags( ) | 終止已設置的輸出格式狀態。 |
dec 置基數為10 相當於"%d";hex 置基數為16 相當於"%X";oct 置基數為8 相當於"%o"。
設置格式狀態的格式標志:
格式標志 | 作用 |
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 |
測試1:一個按進制輸出的例子(成員函數實現)

int x=30, y=300, z=1024; cout<<x<<' '<<y<<' '<<z<<endl; //按十進制輸出 cout.setf(ios::showbase | ios::uppercase); //設置基指示符輸出和數值中的字母大寫輸出 cout<<x<<' '<<y<<' '<<z<<endl; cout.unsetf(ios::showbase | ios::uppercase); //取消基指示符輸出和數值中的字母大寫輸出 cout.setf(ios::oct); //設置為八進制輸出,此設置不取消一直有效 cout<<x<<' '<<y<<' '<<z<<endl; //按八進制輸出 cout.setf(ios::showbase | ios::uppercase); //設置基指示符輸出和數值中的字母大寫輸出 cout<<x<<' '<<y<<' '<<z<<endl; cout.unsetf(ios::showbase | ios::uppercase); //取消基指示符輸出和數值中的字母大寫輸出 cout.unsetf(ios::oct); //取消八進制輸出設置,恢復按十進制輸出 cout.setf(ios::hex); //設置為十六進制輸出 cout<<x<<' '<<y<<' '<<z<<endl; cout.setf(ios::showbase | ios::uppercase); //設置基指示符輸出和數值中的字母大寫輸出 cout<<x<<' '<<y<<' '<<z<<endl; cout.unsetf(ios::showbase | ios::uppercase); //取消基指示符輸出和數值中的字母大寫輸出 cout.unsetf(ios::hex); //取消十六進制輸出設置,恢復按十進制輸出 cout<<x<<' '<<y<<' '<<z<<endl;
測試2:一個按進制輸出的例子(操作控制符實現)

#include<iomanip.h> void main() { int x=30, y=300, z=1024; cout<<x<<' '<<y<<' '<<z<<endl; //按十進制輸出 cout<<oct<<x<<' '<<y<<' '<<z<<endl; //按八進制輸出 cout<<setiosflags(ios::showbase); //設置基指示符 cout<<x<<' '<<y<<' '<<z<<endl; //仍按八進制輸出 cout<<resetiosflags(ios::showbase); //取消基指示符 cout<<hex<<x<<' '<<y<<' '<<z<<endl; //按十六進制輸出 cout<<setiosflags(ios::showbase | ios::uppercase); //設置基指示符和數值中的字母大寫輸出, cout<<x<<' '<<y<<' '<<z<<endl; //仍按十六進制輸出 cout<<resetiosflags(ios::showbase | ios::uppercase); //取消基指示符和數值中的字母大寫輸出 cout<<x<<' '<<y<<' '<<z<<endl; //仍按十六進制輸出 cout<<dec<<x<<' '<<y<<' '<<z<<endl; //按十進制輸出 }
測試3:打印如下格式的一段文字
第一章
1.1 什么是C語言...........................1
1.11 C語言的歷史..........................58
第二章

#include <iostream.h> void main() { cout<<"第一章"<<endl; cout<<" "; cout.setf(ios::left); //設置對齊方式為left cout.width(7); //設置寬度為7,不足用空格填充 cout<<"1.1"; cout<<"什么是C語言"; cout.unsetf(ios::left); //取消對齊方式,用缺省right方式 cout.fill('.'); //設置填充方式 cout.width(30); //設置寬度,只對下條輸出有用 cout<<1<<endl; cout<<" "; cout.width(7); //設置寬度 cout.setf(ios::left); //設置對齊方式為left cout.fill(' '); //設置填充,缺省為空格 cout<<"1.11"; cout<<"C語言的歷史"; cout.unsetf(ios::left); //取消對齊方式 cout.fill('.'); cout.width(30); cout<<58<<endl; cout.fill(' '); cout<<"第二章"<<endl; }

/*一個使用填充,寬度,對齊方式的例子*/ #include <iomanip.h> void main() { cout<<"第一章"<<endl; cout<<" "; cout<<setiosflags(ios::left)<<setw(7); //設置寬度為7,left對齊方式 cout<<"1.1"; cout<<"什么是C語言"; cout<<resetiosflags(ios::left); //取消對齊方式 cout<<setfill('.')<<setw(30)<<1<<endl; //寬度為30,填充為'.'輸出 cout<<setfill(' '); //恢復填充為空格 cout<<" "; cout<<setw(7)<<setiosflags(ios::left); //設置寬度為7,left對齊方式 cout<<"1.11"; cout<<"C語言的歷史"; cout<<resetiosflags(ios::left); //取消對齊方式 cout<<setfill('.')<<setw(30)<<58<<endl; //寬度為30,填充為'.'輸出 cout<<setfill(' ')<<"第二章"<<endl; }
測試4:浮點數的格式(操作控制符實現)

/*關於浮點數的格式*/ #include <iostream.h> void main() { float f=2.0/3.0,f1=0.000000001,f2=-9.9; cout<<f<<' '<<f1<<' '<<f2<<endl; //正常輸出 cout.setf(ios::showpos); //強制在正數前加+號 cout<<f<<' '<<f1<<' '<<f2<<endl; cout.unsetf(ios::showpos); //取消正數前加+號 cout.setf(ios::showpoint); //強制顯示小數點后的無效0 cout<<f<<' '<<f1<<' '<<f2<<endl; cout.unsetf(ios::showpoint); //取消顯示小數點后的無效0 cout.setf(ios::scientific); //科學記數法 cout<<f<<' '<<f1<<' '<<f2<<endl; cout.unsetf(ios::scientific); //取消科學記數法 cout.setf(ios::fixed); //按點輸出顯示 cout<<f<<' '<<f1<<' '<<f2<<endl; cout.unsetf(ios::fixed); //取消按點輸出顯示 cout.precision(18); //精度為18,正常為6 cout<<f<<' '<<f1<<' '<<f2<<endl; cout.precision(6); //精度恢復為6 }

#include <iomanip.h> void main() { float f=2.0/3.0,f1=0.000000001,f2=-9.9; cout<<f<<' '<<f1<<' '<<f2<<endl; //正常輸出 cout<<setiosflags(ios::showpos); //強制在正數前加+號 cout<<f<<' '<<f1<<' '<<f2<<endl; cout<<resetiosflags(ios::showpos); //取消正數前加+號 cout<<setiosflags(ios::showpoint); //強制顯示小數點后的無效0 cout<<f<<' '<<f1<<' '<<f2<<endl; cout<<resetiosflags(ios::showpoint); //取消顯示小數點后的無效0 cout<<setiosflags(ios::scientific); //科學記數法 cout<<f<<' '<<f1<<' '<<f2<<endl; cout<<resetiosflags(ios::scientific); //取消科學記數法 cout<<setiosflags(ios::fixed); //按點輸出顯示 cout<<f<<' '<<f1<<' '<<f2<<endl; cout<<resetiosflags(ios::fixed); //取消按點輸出顯示 cout<<setprecision(18); //精度為18,正常為6 cout<<f<<' '<<f1<<' '<<f2<<endl; cout<<setprecision(6); //精度恢復為6 }