二、成員函數setf()
函數serf()是類ios的成員函數,用來設置格式標誌,它有兩種重載方式。
1.self()的第一種重載形式函數setf()最常用的形式是:longsetf(long);
其中,參數f可以是表11.1中指定的一個格式標誌,也可以是通過按位或運算符I連接起來的多個格式標誌。
該函數設置由參數據指定的格式標誌,並退回本次設置之前的格式字,格式字是記錄著所有格式標誌狀態的長整數。例11.1使用函數setf(kmg)設置數值輸出格式。include
main()icout:200cendl;cout.setf(ios::hex);coutc200cendl;coutsetf(ios:;showbaseIios::uppercase);coutc200cendl;I程序輸出結果:200c80XC8在這個例子中,當我們沒設置數值格式時,數值以十進製格式輸出。通過語句cout,setf(ios::hex);改變輸出數值格式為十六進製。而語句cout.setf(ios::showbaseIios::showbase);使用按位或運算符I將兩個格式標誌ios::showbase和ios::uppercase連接起來,即設置輸出十六進製的指示符,同時將數值中的英文字母轉換成大寫形式。注意十六進製的指示符為0x,八進製的指示符為0,十進製沒有指示符。
2.setf()的第二種重載形式setf()還有一個重載形式:longsetf(longfl,longf2);
在這種形式中,函數首先清除2中的格式標誌,然後設置由參數fl指定的格式標誌。注意,如果fl中包含f2中沒有的格式標誌時,僅有被f2指定的那些格式標誌才起作用。該函數返回本次設置之前的格式字。
例11.2使用函數setf(long,long)設置數值輸出格式。include在這個例子中,語句cout.setf(ios::showposIios::showpoint);用來設置格式標誌ios::showpos和ios::showpoint,這樣,輸出正數時,在前麵顯示“+”號,輸出浮點數時,顯示小數點以後的零位部分。因此語句coutc11.2endl;的輸出結果為+11.200000。注意,當沒設置浮點數的小數部分輸出位數時,顯示6位小數。
接著執行語句cout.setf(ios::showpoint,ios::showposIios::showpoint);該語句先清除格式標誌ios::showpos和ios::showpoint,再重新設置標誌ios::showpointo這樣,輸出正數時,不再顯示“+”號,因此語句coutc11.2-Cendl;的輸出結果為11.200000。
Visual C++的格式標誌中,有些格式標誌之間是存在一定的依賴關係的,例如,dec、oct和hex格式標誌,在任何時候,它們之中隻能有一個被設置,在設置其中一個的同時應清除其他的格式標誌。類似的格式標誌組還有left、right、internal和scientific、fixed。
為了便於設置這些相斥的格式標誌,在類ios中定義了三個格式字段常數(公有的靜態常量符號):staticconstlongbasefield;值為decIoctIhex。staticconstlongadjustfield;//值為leftIrightIinternal。staticconstlongfloatfield;//值為scientificIfixed。
注意,使用setf(long)函數時,由於它不清除原先設置的狀態,在相斥的格式進行轉換時容易發生問題。
例11.3使用函數setf(long,long)設置數相斥的格式標誌。
用來指定以十進製輸出數值,並把原先的格式字保存到變量oldbase中。由於原先的標誌為十六進製,因此,當執行語句
cout.setf(oldbase,ios::basefield);時,又恢複到十六進製。當執行最後一條語句cout.setf(ios::oct);時,準備將數值格式轉換為八進製,但由於函數setf(long)無法清除原先的格式,使得轉換失敗,輸出結果仍為先前的十六進製數。
三、成員函數flags()
flags()是類ios的成員函數,用來獲取或設置格式標誌狀態,它有兩種重載形式。