正文 第十一章 再論C++的輸入_輸出(一)(3 / 3)

1.flags()的第一種重載形式flags()的第一種重栽形式的原型為:longflags();在此種形式中,flags()函數不帶任何參數,隻返回當前的格式字。

格式字是一個32位的長整數,它的低15位用來表示15個格式標誌的狀態。若某一位為1則表示設置了對應的格式標誌,若為0,則表示清除了該格式標誌。

在類ios中定義的輸入/輸出格式標誌,它們都是一些枚舉常量,每個格式標誌都有對應的枚舉值。

我們可以通過格式標誌和格式字的按位與運算符&,來檢測當前狀態下某個格式標誌的設置情況。上麵的if語句測試格式標誌ios::hex的狀態。若表達式ios::hex&status的值為真,表示ios::hex為設置狀態,若為假,則表示ios::hex為清除狀態。

所以,常把格式標誌叫做格式位。例如,我們可以說,設置ios::hex位,清除ios::hex位。

setf()盡管也能返回當前的格式字,但是它首先改變了一個或多個標誌的狀態,然後返回改變前的格式字。如果我們隻需要知道當前格式的設置情況,而不想做任何改動,則應該使用flap0函數。

2.flags()的第二種重栽形式flags0函數的第二種重栽形式的原型為:longflags(longflags—word);該函數帶有一個參數flagswoid,使用該參數來設置格式狀態,並返回以前的格式字。

注意,flap(long)函數的這種重栽形式與setf(long)函數功能是不同的在setf(long)函數中,參數用來指定一個或多個格式標誌,Visual C++將在格式字中設置這些格式標誌,不影響其他的格式標誌。在flags(long)中,參數規定的不是格式標誌而是指定整個格式字,清除所有其他的格式標誌,使用新的格式字重新設置所有格式標誌。

在使用fkg3(long)函數設置標誌字時,為了在一次搡作中不影響標誌字中的其他格式標誌,應先使用flags()獲得標誌字,將這個標誌字的某位設或清除之後,再使用flags(long)將新的標誌字置回到流中。

這樣,以後從輸入流中提取字符或字符串時,前導空白符作為有效的字符被提取。在這個語句中,是按位與運算符,是按位取反運算符。

四、其他的成員函霣

Width(),precision()和ffll()都是類ios的成員函數,分別用來設置域寬、精度和填充字符。

1.width()函數當輸出一個數據時,可以通過width()函數指定數據的最小寬度。width()函數原型為:intwidth(intw);其中,參數指定新的域寬(數據流的寬度),並返回以前的域寬。

當輸出數據的寬度比設置的域寬小時,空餘的位置用填充字符號來補滿。當數據的寬度大於所設置的域寬時,設置的域寬將無效,整個數據完全顯示出來。width()還有一種重載形式,其函數原型為:intwidth()該形式返回當前的域寬。

2.precision()函數

precision()函數用來設置浮點數小數部分的顯示位數,即浮點數的椿度。缺省錆況下,輸出浮點數時最多顯示到小數點後6位數字。precision()函數原型為:intprecision(intp);其中,參數p指定新的補度值,該函數返回原來的精度值。precision()還有一種重載形式,其函數原型為:intprecision()該形式返回當前的精度值。

3.fill()函數fill()函數用來設置填充字符,其函數原型為:charfill(charch);其中,參數ch指定新的填充字符,該函數埠回原來的填充字符。缺省時填充字符使用空格符。fill()還有一種重載形式,其函數原型為:charfill();該形式返回當前的填充字符。

在在這個例子中,語句cout.setf(ios::left,ios::adjustfield);指定輸出數據為左對齊,即數據顯示在左邊,填充字符在右邊。其中填充字符由語句cout.fill()指定。

語句cout.width(8)指定域寬為8,所以,輸出數值1234財,在右邊用四個填充字符“”補齊。而輸出數值123456789時,該數值超出域寬,因此不理會域寬,完整地顯示出來。在輸出浮點數12.3456789時,使用語句cout.precision(2);設置浮點數精度為2,所以,隻顯示兩位小數為12.34,域寬中剰餘的3個空位有填充。