1. 修改顯示時(shí)的計(jì)數(shù)系統(tǒng)
ostream
類是從ios
類派生而來(lái),ios
類是從ios_base
類派生而來(lái)。ios_base
類存儲(chǔ)了描述格式狀態(tài)的信息,例如一個(gè)類成員中某些位決定使用哪個(gè)計(jì)數(shù)系統(tǒng)(如八/十/十六進(jìn)制),另外一個(gè)成員決定字段的寬度,且ios_base
是ostream
間接基類,因此ostream
也可以修改計(jì)數(shù)系統(tǒng)和字段寬度。
對(duì)于設(shè)置顯示整數(shù)的計(jì)數(shù)系統(tǒng)整數(shù),我們使用dec
、hex
和oct
控制符來(lái)控制整數(shù)是以十進(jìn)制、十六進(jìn)制還是八進(jìn)制顯示。例如:
int n = 13;
hex(cout); //控制符實(shí)際上是函數(shù)但不是成員函數(shù),因此不必通過(guò)對(duì)象來(lái)調(diào)用,也可以使用cout < < hex;
cout < < n; //輸出d
cout < < hex;//等同hex(cout)
cout < < n; //輸出d
cout < < oct;//等同oct(cout),將輸出顯示設(shè)置為八進(jìn)制
cout < < n; // 輸出15
cout < < dec < < n;//輸出13
2. 調(diào)整字段寬度
ostream
使用width()
成員函數(shù)將長(zhǎng)度不同的數(shù)字放到寬度相同的字段中,該方法的原型如下:
int width(); //該方法返回字段寬度的當(dāng)前設(shè)置
int width(int i); //該方法將字段寬度設(shè)置為i個(gè)空格,并返回以前的字段寬度值。這樣使得能夠保存以前的值,以便以后恢復(fù)寬度值使用
width()
方法只影響將顯示的下一個(gè)項(xiàng)目,然后字段的寬度將恢復(fù)為默認(rèn)值。例如:
cout < < "字段默認(rèn)寬度:" < < cout.width() < < endl;
cout < < "12345" < < endl;//顯示12345,方便查看后面每個(gè)對(duì)象顯示的時(shí)候占用的寬度
cout.width(3);//將字段寬度設(shè)置為3
cout < < 'a' < < 'b' < < 'c' < < endl;
cout.width(2);
cout < < "aaa";//測(cè)試當(dāng)字節(jié)寬度設(shè)置過(guò)小,是否影響顯示,該語(yǔ)句執(zhí)行后字符寬度將恢復(fù)為默認(rèn)值0
auto i = cout.width(3);//i=0
auto j = cout.width(4);//由于上一個(gè)語(yǔ)句已經(jīng)將寬度設(shè)置為3,因此j=3
auto k = cout.width(1);//k=4
cout < < endl;
cout < < "i = " < < i < < endl;
cout < < "j = " < < j < < endl;
cout < < "k = " < < k < < endl;
其對(duì)應(yīng)的輸出為
字段默認(rèn)寬度:0
12345
abc
aaa
i = 0
j = 3
k = 4
從上面的例子可以看出,將字段寬度設(shè)置為3后,字符a
顯示字符寬度為3,其余位置填充空格,且默認(rèn)為右對(duì)齊。將字段寬度設(shè)置為2后,顯示字符串"aaa"
,從結(jié)果我們可以看到,字符串正常顯示,由此可以看出,cout
不會(huì)截短數(shù)據(jù)。當(dāng)顯示完字符串aaa
后,我們將字符寬度設(shè)置為3,記錄上一項(xiàng)目的字符寬度為i
,從打印結(jié)果來(lái)看,當(dāng)顯示完字符串aaa
后,寬度自動(dòng)恢復(fù)為默認(rèn)值0,因此i
輸出結(jié)果為0。
3. 填充字符
默認(rèn)情況下,cout
使用空格填充字段中未被使用的部分,我們?cè)?.2中的例子已經(jīng)驗(yàn)證過(guò)了,那填充字符可以設(shè)置嗎?答案是肯定的,使用其成員函數(shù)fill()
來(lái)改變填充字符,例如:
cout.fill('-');
cout < < "12345" < < endl;
cout.width(2);
cout < < 'a' < < 'b' < < endl;
cout.width(4);
cout < < 'a' < < 'b' < < endl;
輸出結(jié)果:
12345
-ab
---ab
由輸出結(jié)果可知,填充字符的設(shè)置與字符寬度設(shè)置不同的是,新填充的字符將一直有效,直到它更改為止。
4. 設(shè)置浮點(diǎn)數(shù)的顯示精度
C++的默認(rèn)精度為6位(末尾的0不顯示)。cout
的precision()
成員函數(shù)可以設(shè)置顯示精度,例如:
float a = 3.1415;
float b = 0.123456789;
cout < < "a = " < < a < < endl;
cout < < "b = " < < b < < endl;
cout.precision(2);
cout < < "a = " < < a < < endl;
cout < < "b = " < < b < < endl;
輸出結(jié)果:
a = 3.1415
b = 0.123457
a = 3.1
b = 0.12
從輸出結(jié)果可以看出,precision()
也是設(shè)置一次,一直有效,直到重新設(shè)置為止。
5. setf()
C++使用setf()
成員函數(shù)控制小數(shù)點(diǎn)被顯示時(shí)其他幾個(gè)格式選項(xiàng),其中cout.setf(std::ios_base::showpoint)
設(shè)置cout
打印浮點(diǎn)類型中末尾的0和小數(shù)點(diǎn)。例如:
float a = 13.1415;
float b = 0.123456789;
cout.setf(std::ios_base::showpoint);
cout < < "a = " < < a < < endl;
cout < < "b = " < < b < < endl;
cout.precision(2);
cout < < "a = " < < a < < endl;
cout < < "b = " < < b < < endl;
輸出結(jié)果:
a = 13.1415
b = 0.123457
a = 13.
b = 0.12
從輸出結(jié)果可以看出,setf()
也是設(shè)置一次,一直有效,直到重新設(shè)置為止。
setf()
有兩個(gè)原型,第一個(gè)為:
fmtflags setf(fmtflags); //fmtflags是bitmask類型(一種用來(lái)存儲(chǔ)各個(gè)位值的類型)的typedef名,用于存儲(chǔ)格式的標(biāo)記
該版本的setf()
用來(lái)設(shè)置單個(gè)位控制的格式信息。參數(shù)是一個(gè)fmtflags
值,指出要設(shè)置哪一位。返回值的類型為fmtflags
的數(shù)字,指出所有標(biāo)記以前的設(shè)置。例如要將第11位設(shè)置為1,則需要傳遞一個(gè)第11位為1的數(shù)字,返回值為原來(lái)第11位的值。ios_base
類定義了代表位值的常量,下表為其中一部分常用的定義:
【 注: 注意,僅當(dāng)基數(shù)為10時(shí)才使用加號(hào)。C++將十六進(jìn)制和八進(jìn)制都視為無(wú)符號(hào)的,因此對(duì)它們,無(wú)需使用符號(hào)(然而,有些C++實(shí)現(xiàn)可能仍然會(huì)顯示加號(hào))。】
例子:
using std::cout;
using std::endl;
using std::ios_base;
int size = 40;
int a = 63;
cout.width(size);
cout < < "cout default: a = " < < a < < endl;
cout.width(size);
cout.setf(ios_base::showpos); //顯示+
cout < < "cout.setf(ios_base::showpos): a = " < < a < < endl;
cout.width(size);
std::hex(cout); //使用hex
cout < < "std::hex(cout): a = " < < a < < endl;
cout.width(size);
cout.setf(ios_base::uppercase); // 使用大寫(xiě)字母
cout < < "cout.setf(ios_base::uppercase): a = " < < a < < endl;
cout.width(size);
cout.setf(ios_base::showbase); // 使用0X前綴
cout < < "cout.setf(ios_base::showbase): a = " < < a < < endl;
cout.width(size);
cout < < "cout default: true = " < < true < < endl;
cout.width(size);
cout.setf(ios_base::boolalpha);
cout < < "cout.setf(ios_base::boolalpha): true = " < < true < < endl;
輸出結(jié)果:
cout default: a = 63
cout.setf(ios_base::showpos): a = +63
std::hex(cout): a = 3f
cout.setf(ios_base::uppercase): a = 3F
cout.setf(ios_base::showbase): a = 0X3F
cout default: true = 0X1
cout.setf(ios_base::boolalpha): true = true
第二個(gè)setf()
原型接受兩個(gè)參數(shù),并返回以前的設(shè)置:
fmtflags setf(fmtflags, fmtflags);
第一參數(shù)和以前一樣,也是一個(gè)包含了所需設(shè)置的fmtflags
值。第二參數(shù)指出要清除第一個(gè)參數(shù)中的哪些位。例如,將第3位設(shè)置為1表示以10為基數(shù),將第4位設(shè)置為1表示以8為基數(shù),將第5位設(shè)置為1表示以16為基數(shù)。假設(shè)輸出是以10為基數(shù)的,而要將它設(shè)置為以16為基數(shù),則不僅需要將第5位設(shè)置為1,還需要將第3位設(shè)置為0——這叫作清除位(clearing the bit)。使用函數(shù)setf( )
時(shí),要做的工作多些,因?yàn)橐玫诙?shù)指出要清除哪些位,用第一參數(shù)指出要設(shè)置哪位。ios_base
類為此定義了常量(如下表所示)。
具體地說(shuō),要修改基數(shù),可以將常量ios_base::basefield
用作第二參數(shù),將ios_base::hex
用作第一參數(shù)。也就是說(shuō),下面的函數(shù)調(diào)用與使用十六進(jìn)制控制符的作用相同:
cout.setf(ios_base::hex, ios_base::basefield); //與hex(cout);作用相同
其具體使用方法,如下例所示:
cout.setf(ios_base::left, ios_base::adjustfield);//左對(duì)齊
cout.setf(ios_base::showpos);//在正數(shù)前面加上+
cout.setf(ios_base::showpoint);//顯示小數(shù)點(diǎn)和末尾的0
cout.precision(3);
//使用科學(xué)計(jì)數(shù)法顯示,并保存默認(rèn)的計(jì)數(shù)法
ios_base::fmtflags old =
cout.setf(ios_base::scientific, ios_base::floatfield);
cout < < "Left Justification:n";
long n;
for (n = 1; n <= 41; n += 10) {
cout.width(4);
cout < < n < < "|";
cout.width(12);
cout < < sqrt(double(n)) < < "|n";
}
cout.setf(ios_base::internal, ios_base::adjustfield);//居中對(duì)齊
//恢復(fù)默認(rèn)計(jì)數(shù)法
cout.setf(old, ios_base::floatfield);
cout < < "Internal Justification:n";
for (n = 1; n <= 41; n += 10) {
cout.width(4);
cout < < n < < "|";
cout.width(12);
cout < < sqrt(double(n)) < < "|n";
}
cout.setf(ios_base::right, ios_base::adjustfield);//右對(duì)齊
cout.setf(ios_base::fixed, ios_base::floatfield);//使用定點(diǎn)計(jì)數(shù)法
cout < < "Right Justification:n";
for (n = 1; n <= 41; n += 10) {
cout.width(4);
cout < < n < < "|";
cout.width(12);
cout < < sqrt(double(n)) < < "|n";
}
輸出結(jié)果:
Left Justification:
+1 |+1.000e+00 |
+11 |+3.317e+00 |
+21 |+4.583e+00 |
+31 |+5.568e+00 |
+41 |+6.403e+00 |
Internal Justification:
+ 1|+ 1.00|
+ 11|+ 3.32|
+ 21|+ 4.58|
+ 31|+ 5.57|
+ 41|+ 6.40|
Right Justification:
+1| +1.000|
+11| +3.317|
+21| +4.583|
+31| +5.568|
+41| +6.403|
【 注: 對(duì)于setf()
的效果可以通過(guò)unsetf()
消除,其原型為void unsetf(fmtflags mask);
。其中,mask是位模式。mask中所有的位都設(shè)置為1,將使得對(duì)應(yīng)的位被復(fù)位。也就是說(shuō),setf()
將位設(shè)置為1,unsetf()
將位恢復(fù)為0。】
6. 標(biāo)準(zhǔn)控制符
對(duì)于用戶來(lái)說(shuō),使用setf()
進(jìn)行格式化并不是最友好的方法。為此C++提供了多個(gè)控制符來(lái)完成相應(yīng)的格式化效果,其能夠調(diào)用setf()
,并自動(dòng)提供正確的參數(shù)。例如我們前面介紹過(guò)的dec
、hex
和oct
。C++常用控制符如下表所示:
7. 頭文件iomanip
使用iostream
工具來(lái)設(shè)置一些格式值(如字段寬度)非常麻煩。為了簡(jiǎn)化工作,C++在頭文件中提供了其他的一些控制符,不但可以提供前面提到過(guò)的格式設(shè)置,而且用起來(lái)方便。其中常用的控制符如下:
setprecision()//設(shè)置精度,其接受一個(gè)指定精度的整數(shù)參數(shù)
setfill() //填充字符,其接受一個(gè)指定填充字符的char參數(shù)
setw() //設(shè)置字段寬度,其接受一個(gè)指定字段寬度的整數(shù)參數(shù)。
由于它們都是控制符,因此可以用cout
語(yǔ)句連接起來(lái)。這樣,setw()
控制符在顯示多列值時(shí)尤其方便。其使用方法如下例所示:
#include < cmath >
#include < iomanip >
#include < iostream >
int main() {
using namespace std;
// use new standard manipulators
cout < < fixed < < right;
// use iomanip manipulators
cout < < setw(6) < < "N" < < setw(14) < < "square root" < < setw(15)
< < "fourth rootn";
double root;
for (int n = 10; n <= 100; n += 10) {
root = sqrt(double(n));
cout < < setw(6) < < setfill('.') < < n < < setfill(' ') < < setw(12)
< < setprecision(3) < < root < < setw(14) < < setprecision(4) < < sqrt(root)
< < endl;
}
return 0;
}
輸出結(jié)果:
N square root fourth root
....10 3.162 1.7783
....20 4.472 2.1147
....30 5.477 2.3403
....40 6.325 2.5149
....50 7.071 2.6591
....60 7.746 2.7832
....70 8.367 2.8925
....80 8.944 2.9907
....90 9.487 3.0801
...100 10.000 3.1623
【 注: 最后一行10.000,是使用fixed控制符導(dǎo)致顯示末尾的0。】
-
控制器
+關(guān)注
關(guān)注
114文章
16998瀏覽量
183163 -
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7637瀏覽量
166540 -
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2287瀏覽量
96089 -
C++語(yǔ)言
+關(guān)注
關(guān)注
0文章
147瀏覽量
7239
發(fā)布評(píng)論請(qǐng)先 登錄
請(qǐng)問(wèn)用keil怎么在串口上顯示浮點(diǎn)數(shù)?
STM32CubeIDE是否需要配置任何設(shè)置才能正確顯示浮點(diǎn)數(shù)呢
浮點(diǎn)數(shù)在單片機(jī)數(shù)據(jù)采集監(jiān)控系統(tǒng)中的應(yīng)用
浮點(diǎn)數(shù)的表示方法

浮點(diǎn)數(shù)常用的編碼方法

STM32如何通過(guò) printf 打印出浮點(diǎn)數(shù)
Xilinx怎么定點(diǎn)數(shù)轉(zhuǎn)浮點(diǎn)數(shù)

單片機(jī)顯示浮點(diǎn)數(shù)

談一談浮點(diǎn)數(shù)的精度問(wèn)題

什么是浮點(diǎn)數(shù)?浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)

評(píng)論