輸入輸出格式標記位 格式常量 格式設定函式

2021-04-08 23:34:05 字數 4110 閱讀 2777

c++共有15個  輸入輸出   格式標記位,這15個標記位均為bit位,每個標記位都有自己的含義,且可以單獨設定。

格式標記位的取值為0或1:0表示關閉(不使用此格式),1表示開啟(使用此格式)。

標記位含義

boolalpha

如開啟,則輸入和輸出使用bool值(即ture或false)

showbase

如開啟,則對於輸出,使用c++ 基數字首(0,0x)

showpoint

如開啟,則顯示末尾的小數點

uppercase

如開啟,則對於16進製制,使用大寫字母;對於10進製,使用e表示法

showpos

如開啟,則在正數前面加上+

標記位

含義dec

如開啟,則使用基數10(進行輸出)

oct如開啟,則使用基數8

hex如開啟,則使用基數16

fixed

如開啟,則使用定點計數法

scientific

如開啟,則使用科學計數法

left

如開啟,則使用左對齊

right

如開啟,則使用右對齊

internal

如開啟,則符號或基數字首左對齊,值右對齊

標記位

含義skipws

如開啟,則跳過輸入流中的空白字元

unitbuf

如開啟,則每次輸出操作後都會清空緩衝區

先來看乙個簡單的程式:

#include

using namespace std;

int main()

輸出結果是:

setf()函式用於設定格式標記,函式接受乙個設格式常量作為引數,在設定成功之後函式會返回乙個值,該值指出了所有15個標記的上一次設定情況。

但將這個返回值進行輸出,並不是每乙個標記位的bit值,而是乙個整數,為什麼?

實際上,這15個bit值視為乙個整體,從而組成乙個二進位制數,並能夠轉化為十進位制數。

這15個標記位的排列順序是:

uppercase

unitbuf  

skipws 

showpos

showpoint 

showbase 

scientific

right

oct 

left

internal

hexfixed

decboolalpha

比如,setf()函式第一次的返回值是4098,這個值實際上是輸出格式的初始狀態,轉化二進位制為001000000000010,那麼格式狀態為:

uppercase

unitbuf  

skipws 

showpos

showpoint 

showbase 

scientific

right

oct 

left

internal

hexfixed

decboolalpha00

1000

0000

0001

0

而6146轉化為二進位制001100000000010,這一次的值反映的是開啟了showpos位後的格式狀態:

uppercase

unitbuf  

skipws 

showpos

showpoint 

showbase 

scientific

right

oct 

left

internal

hexfixed

decboolalpha00

1100

0000

0001

0

兩次對比,我們可以看出,的確是在初始狀態的基礎上開啟了showpos位。

接著我們來看看格式常量,格式常量一共有18個,其中15個用於開啟相應的格式標記為,另外3個做為指示功能用

#include

using namespace std;

int main()

{cout << "boolalpha    " << ios::boolalpha <格式常量

十進位制值

意義ios::boolalpha

1開啟boolalpha標記位,輸入和輸出使用bool值(即ture或false)

ios::showbase

512開啟showbase標記位,對於輸出,使用c++ 基數字首(0,0x)

ios::showpoint

1024

開啟showpoint標記位,顯示末尾的小數點

ios::uppercase

16384

開啟uppercase標記位,對於16進製制,使用大寫字母;對於10進製,使用e表示法

ios::showpos

2048

開啟showpos標記位,在正數前面加上+

格式常量

十進位制值

意義格式常量

十進位制值

意義ios::basefield

74ios::dec

2開啟dec標記位,使用基數10

ios::oct

64開啟oct標記位,使用基數8

ios::hex

8開啟hex標記位,使用基數16

ios::floatfield

260ios::fixed

4開啟fixed標記位,使用定點計數法

ios::scientific

256開啟scientific標記位,使用科學計數法

ios::adjustfield

176ios::left

32開啟left標記位,使用左對齊

ios::right

128開啟right標記位,使用右對齊

ios::internal

16開啟internal標記位,符號或基數字首左對齊,值右對齊

注意:這些都是常量,是作為 函式引數 來設定格式狀態,而不是格式標記位的儲存空間。

15個藍色的格式常量用來開啟對應的格式標記位,如果將其十進位制值轉化為二進位制,再於標記位順序錶比對,就可以看出來。

3個綠色的格式常量用來指示標記位,為什麼要指示?比如:dec、oct、hex是不可能同時開啟的,而ios::basefield

則指示這三個標記位為一組,74=2+64+8,這意味著它轉化為二進位制的比對情況是dec、oct、hex為1,但它不是設定標記位,而是指示,具體原理在setf()函式中詳細解釋。

最後來看看setf()函式:

setf()函式有兩種原型,一種是fmtflags  setf  ( fmtflags );

它接收乙個引數,該引數是一種 標記型別,提供實參時,可以是整數,該整數轉化為二進位制後賦給格式狀態。但這種方法抽象且不安全。

也可以將格式常量作為實參提供給函式,在這種情況下,setf()函式會開啟相應的標記位,且不會影響其它標記位。但這種方法仍不安全。很明顯,既開啟dec標記位,又開啟oct標記位是沒有意義的。

另一種原型是fmtflags  setf  ( fmtflags , fmtflags );

它接收兩個 標記型別 的引數。第乙個引數指出要開啟的標記位,第二個引數則是指示要清除的一批相關位。

比如:cout.setf( ios::hex, ios::basefield );  這表示使用16進製制輸出格式。首先,ios::basefield指示出了要清除的標記位,setf()函式將ios::basefield所指示的標記位,即dec、oct、hex全部清零。然後ios::hex使得setf()函式開啟hex標記位。這是一種安全的方法,避免了同時開啟dec、hex兩個標記位等沒有實際意義的情況發生。

setf()是如何實現清除的?

ios::basefield轉化為二進位制000000001001010,這三個1的位置指示的是dec、oct、hex標記位。setf()函式將這個二進位制數取反111111110110101,然後與原格式狀態標記位進行「與」操作,使得原格式狀態的dec、oct、hex標記位為0,而其它標記位不變。(參看《c++ primer plus》683頁位操作)

然後setf()函式根據第乙個引數ios::hex將格式狀態的hex標記位開啟,其它標記位不變。至此,格式設定就成功完成了。我們也可以看出,setf()函式不會影響無關標記位的狀態。

c 輸入輸出格式控制

使用這些格式需要宣告包含 long flags const 返回當前的格式標誌。long flays long newflag 設定格式標誌為newflag,返回舊的格式標誌。long setf long bits 設定指定的格式標誌位,返回舊的格式標誌。long setf long bits,lo...

python的輸入輸出格式

1.輸入格式 1 直接輸入 raw input 提示詞 2 將輸入的值賦值給passwd passwd raw input 請輸入你的密碼 3 將輸入的值轉換型別賦值給price price float raw input 水果的單價 2.輸出格式 1 print 格式化字串 變數1 print 你...

ACM常用輸入輸出格式

因為acm新人對於acm題目中處理輸入輸出存在一些疑惑,於是在這裡記錄幾種常用的輸入輸出方法。int n scanf d n while n c int a while scanf d a eof c int a while cin a c int n while scanf d n n 0 c i...