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 格式化輸入輸出
cin與cout 一 標準輸入函式cin 不知道說它是個函式對還是不對,它是代表標準的輸入裝置 鍵盤。他是屬於流的,他的用法和流的用法是一樣的。也就是 cin 變數 小小的說明一下,輸入多個變數可以寫在一行,如 cin x y z 這樣寫不是不允許,而是不好看,如果是不同的變數型別,那就更是沒頭沒腦...
格式化輸入 輸出
scanf 函式和 printf 函式是c語言程式設計中使用最頻繁的兩個函式,他們用來格式化輸入和輸出。printf 函式 printf 格式串,表示式1,表示式2 格式串包含普通字元和轉換說明 轉換說明以 字元開頭 轉換說明可以用 m.px格式或 m.px格式 m和p都是整數常量,而x是字母。m和...
格式化輸入輸出
格式化輸入輸出 1.printf flags width prec hil type scanf flag type flag 標誌 含義 左對齊 在前面放 或 space 正數留空 0 0填充 int main width或prec 含義 number 最小字元數 下乙個引數是字元數 number...