在c語言中,我們一般用printf()函式來進行輸出,通過輸出字串中的格式說明符(如%4.2d)可以很容易地格式化輸出。而在c++中,為簡便起見,往往不指定輸出的格式,由系統根據資料的型別採取預設的格式,但有時也需要資料按我們指定的格式輸出,比如以十六進製制的形式輸出乙個整數等。有兩種方法可以達到格式化輸出的目的,一種是使用流物件的有關成員函式,還有一種是使用控制符方法,這兩種方法殊途同歸,它們的原理和起到的作用都是一樣的,只不過使用形式不一樣。
表1 用於控輸出格式的流成員函式及控制符
流成員函式
作用相同的控制符
作用precision(n)
setprecision(n)
設定實數的精度為n位
width(n)
setw(n)
設定字段寬度為n位
fill(c)
setfill(c)
設定填充宇符c
setf(ios::state)
setiosflags(ios::state)
設定輸出格式狀態,括號中應給出格式狀態,內容與控制符setiosflags括號中的內容相同,如表2所示
unsetf(ios::state)
resetioflags(ios::state)
終止已設定的輸出格式狀態,在括號中應指定內容
表2 設定格式狀態的格式標誌
格式標誌
作用ios::left
輸出資料在本域寬範圍內向左對齊
ios::right
輸出資料在本域寬範圍內向右對齊
ios::internal
數值的符號位在域寬內左對齊,數值右對齊,中間由填充字元填充
ios::dec
設定整數的基數為10
ios::oct
設定整數的基數為8
ios::hex
設定整數的基數為16
ios::showbase
強制輸出整數的基數(八進位制數以0打頭,十六進製制數以0x打頭)
ios::showpoint
強制輸出浮點數的小點和尾數0
ios::uppercase
在以科學記數法格式e和以十六進製制輸出字母時以大寫表示
ios::showpos
對正數顯示「+」號
ios::scientific
浮點數以科學記數法格式輸出
ios::fixed
浮點數以定點格式(小數形式)輸出
ios::boolalpha
以「true」/「false」的形式輸出布林值
ios::unitbuf
每次輸出之後重新整理所有的流
ios::stdio
每次輸出之後清除stdout, stderr
我們可以使用用流物件的成員函式來控制輸出格式。比如我們想要以十六進製制來輸出乙個整形,設定字段寬度為8位,並用』*』來填充空白的話,可以使用以下**:
#include
using
namespace
std;
int main()
輸出為:
******1f
#include
#include //不要忘記包含此標頭檔案
using
namespace
std;
int main()
注意:
enum _ios_fmtflags
;
在上述兩種方法中,要設定格式標誌位都需要呼叫函式(setf和setiosflags),比較麻煩,所幸c++還有一組關於格式標誌的函式,可以直接在輸入輸出流中使用,比如要實現之前的輸出格式我們可以這麼寫:
#include
#include
using
namespace
std;
int main()
上面的hex就是這樣的乙個函式,除了hex,表2中的所有格式標誌都通過這種方法設定,如果要終止只需標誌名前加個「no」就可以,比如showpos和noshowpos(表2中前六項沒有no版本)。
另外可以注意到,這裡用hex設定十六進製制的時候並不用像之前一樣先終止十進位制,這是為什麼呢?先來看看hex的函式定義:
inline ios_base&
hex(ios_base& __base)
可以看到hex其實是呼叫了setf函式,但這裡的setf跟我們上面用到的setf函式不同,這是過載之後有兩個形參的setf函式,其定義如下:
fmtflags
setf(fmtflags __fmtfl, fmtflags __mask)
可以看到這裡setf先將mask所對應的位都置0,再將要設定的位置1。具體到hex函式,它是將_s_basefield(_s_dec | _s_oct | _s_hex)都先置0,再將_s_hex位置1。有了這個setf函式,我們在使用hex的時候就不需要先終止dec了,可以直接使用hex。 cout格式化輸出
在使用setf等庫函式時使用 在使用流操縱運算元時使用 using namespace std 以下所有的setf 都有對應的unsetf 用於取消設定 所有的setiosflags 可以用resetiosflags 取消 標誌位fmtflags的命名空間可以使用ios base 或者ios int...
cout格式化輸出
需要引入的標頭檔案 include在使用流操縱運算元時使用 int laneri 12345 double lanerd 56789 1 設定整數進製輸出 過載1 fmtflags ios base setf fmtflags mask 過載2 fmtflags ios base setf fmtf...
cout 格式化輸出
一直習慣於c語言的printf函式來列印,突然有一天要用cout來列印,發現有點不適應。原來cout也是有格式化輸出的。首先要引入標頭檔案 include 在使用setf等庫函式時使用 include 在使用流操縱運算元時使用 cout可以用setw來設定字串的長度,不足的話,可以用setfill來...