概要:
- ios_base類表示流的一般特征,如是否可讀取、是二進制流還是文本流等;
- ios類基於ios_base,其中包括了一個指向streambuf對象的指針成員;
- streambuf類為緩中區提供了內存,並提供用於填充緩沖區、訪問緩沖區內容、刷新緩沖區和管理緩沖區內存的類方法;
- ostream 類是從ios 類派生而來的,提供了輸出方法;
- istream類也是從ios類派生而來的,提供了輸入方法;
- iostream類是基於istream和ostream類的,因此繼承了輸入方法和輸出方法。
1.ostream類的類方法
-
重載的<<運算符
ostream類重新定義了<<運算符,方法是將其重載為輸出。在這種情況下,<<叫做插入運算符,插入運算符被重載,使之能夠識別c++中所有的基本類型。
原型:ostream & operator<<(Type);
函數返回一個指向ostream對象的引用,這使得可以將輸出連接起來。
- put()方法
原型:ostream & put(char);
用於顯示字符,可以用類方法表示法來調用它:
cout.put('W');
和<<運算符一樣,該函數也返回一個指向調用對象的引用,因此可以用它將拼接輸出:
cout.put('w').put('t');
- write()方法
模板原型:basic_ostream<charT,traits> & write(const char_type* s,streamsize n);
write()的第一個參數提供了要顯示的字符串的地址,第二個參數指出要顯示多少個字符,使用cout調用write()時,將調用char具體化,因此返回類型為ostream&,
這使得可以將輸出拼接起來。
write()方法並不會在遇到空字符時自動停止打印字符,而只是打印指定數目的字符,即使超出了字符串的邊界。
- 刷新輸出緩沖區
控制符flush刷新緩沖區,而控制符endl刷新緩沖區,並插入一個換行符。這兩個控制符的使用方式與變量名相同:
cout<<"Hello"<<flush;
cout<<"world"<<endl;
控制符也是函數,可以直接調用flush()來刷新cout緩沖區:
flush(cout);
然而,ostream類對<<運算符進行了重載,所以可用下述表達式替換函數調用:
cout<<flush;
因此可以用更為方便的插入表示法來成功地進行刷新。
- 用cout進行格式化
1.修改顯示時使用的計數系統
要控制整數以十進制、十六進制還是八進制顯示,可以使用dec、hex和oct控制符。
例如,下面的函數調用將cout 對象的計數系統格式狀態設置為十六制:
hex (cout) ;
完成上述設置后,程序將以十六進制形式打印整數值,直到將格式狀態設置為其他選項為止。
注意,控制符不是成員函數,因此不必通過對象來調用。
雖然控制符實際上是函數,但它們通常的使用方式為:
cout<<hex;
2.調整字段寬度
可以使用width成員函數將長度不同的數字放到寬度相同的字段中,該方法的原型為:
int width() ;
int width(int i) ;
第一種格式返回字段寬度的當前設置:第二種格式將字段寬度設置為 i個空格,並返回以前的字段寬度值。這使得能夠保存以前的值,以便以后恢復寬度值時使用。
width()方法只影響將顯示的下一個項目,然后字段寬度將恢復默認值。
使用方法如:cout.width(5);
3.填充字符
在默認情況下,cout用空格填充字段中未被使用的部分,可以用fill()成員函數來改變填充字符。(cout輸出時默認右對齊)
例如,下面的函數調用將填充字符改為星號:
cout.fill('*');
4.設置浮點數的顯示精度
浮點數精度的含義取決於輸出模式。有三種模式:默認模式、定點模式和科學模式。
在默認模式下,它指的是顯示的總位數。在定點模式和科學模式下,精度指的是小數點后面的位數。已經知道, C+的默認精度為6位(但未尾的0將不顯示)。
precision( )成員函數使得能夠選擇其他值。例如,下面語句將cout的精度設置為2:
cout.precision(2) ;
和width()的情況不同,但與fill()類似,新的精度設置將一直有效,直到被重新設置。
5.打印末尾的0和小數點
ios_base類提供了一個setf()函數,能夠控制多種格式化特性。這個類還定義了多個常量,可用作該函數的參數。
下面的函數調用使cout顯示末尾小數點:
cout.setf(ios_base::showpoint);
使用默認的浮點格式時,上述語句還將導致末尾的0被顯示出來。
6.setf()函數
setf()函數有兩個原型。第一個為:
fmtflags setf(fmtflags);
其中fmtflags是bitmask類型的typedef名,用於存儲格式標記。該名稱是在ios_base類中定義的。
這個版本的setf()用來設置單個位控制的格式信息,參數是一個fmtflags值,指出要設置哪一位。返回值是類型為fmtflags的數字,指出所有標記以前的設置,
如果打算以后恢復原始設置,則可以保存這個值。
ios_base類定義了代表位值的常量,使用時,必須加上作用域解析運算符。
常量 | 含義 |
ios_base ::boolalpha | 輸入和輸出bool值,可以為true或false |
ios_base::showbase | 對於輸出,使用C++基數前綴(0, 0x) |
ios_base::showpoint | 顯示末尾的小數點 |
ios_base::uppercase | 對於16進制輸出,使用大寫字母,E表示法 |
ios_base::showpos | 在正數前面加上+ |
第二個setf()原型接受兩個參數,並返回以前的設置:
fmtflags setf(fmtflags,fmtflags);
函數的這種重載格式用於設置由多位控制的格式選項。第一參數和以前一樣,也是一個包含了所需設置的fmtflags值。第二參數指出要清除第一個參數中的哪些位。
第二個參數 | 第一個參數 | 含義 |
ios_base::basefield | ios_base::dec | 使用10進制 |
ios_base::oct | 使用8進制 | |
ios_base::hex | 使用16進制 | |
ios_base::floatfield | ios_base::fixed | 使用定點計數法(即一般計數法) |
ios_base::scientific | 使用科學計數法 | |
ios_base::adjustfield | ios_base::left | 左對齊 |
ios_base::right | 右對齊 | |
ios_base::internal | 符號或基數前綴左對齊,值右對 |
在C++標准中,定點表示法和科學表示法都有下面兩個特征:
- 精度指的是小數位數, 而不是總位數:
- 顯示末尾的0。
調用setf()的效果可以通過unsetf()消除,后者的原型為:
void unsetf(fmtflags mask);
其中,mask是位模式,mask中所有的為都設置為1,將使得對應的位被復位。
您可能注意到了,沒有專門指示浮點數默認顯示模式的標記,系統的工作原理如下:僅當只有定點位被設置時使用定點表示法;僅當只有科學位被設置時使用科學表示法;
對於其他組合,如沒有位被設置或兩位都被設置時,將使用默認模式。因此,啟用默認模式的方法之如下:
cout.setf(0, ios_base::floatfield);
第二個參數關閉這兩位,而第一個參數不設置任何位。一種實現同樣目標的簡捷方式是,使用參數is:floatfield來調用函數unsetf( ):
cout .unsetf (ios_ base: :floatfield);
如果已知cout處於定點狀態,則可以使用參數ios_base:fixed 調用函數unsetf( )來切換到默認模式;然而,無論cout的當前狀態如何,使用參數ios_base:floatfield 調用函數unsetf( )
都將切換到默認模式,因此這是一種更好的選擇。
7.標准控制符
如:下面的語句打開左對齊和定點模式:
cout<<left<<fixed;
8.頭文件iomanip
C++在頭文件iomanip中提供了其他一些控制符,三個最常用的控制符為setprecision()、setfill()、setw(),它們分別用來設置精度、填充字符和字段寬度。
setprecision( )控制符接受一個指定精度的整數參數;
sefill( )控制符接受一個指定填充字符的char參數;
setw( )控制符接受一個指定字段寬度的整數參數。
由於它們都 是控制符,因此可以用cout語句連接起來。這樣,setw( )控制符在顯示多列值時尤其方便。