C++?的cout格式化輸出場(chǎng)景示例詳解
正文
在某些實(shí)際場(chǎng)景中,我們經(jīng)常需要按照一定的格式輸出數(shù)據(jù),比如輸出浮點(diǎn)數(shù)時(shí)保留 2 位小數(shù),再比如以十六進(jìn)制的形式輸出整數(shù),等等。
對(duì)于學(xué)過 C 語(yǔ)言的讀者應(yīng)該知道,當(dāng)使用 printf() 函數(shù)輸出數(shù)據(jù)時(shí),可以通過設(shè)定一些合理的格式控制符,來達(dá)到以指定格式輸出數(shù)據(jù)的目的。例如 %.2f 表示輸出浮點(diǎn)數(shù)時(shí)保留 2 位小數(shù),%#X 表示以十六進(jìn)制、帶 0X 前綴的方式輸出整數(shù)。
關(guān)于 printf() 函數(shù)支持的格式控制符,更詳細(xì)的講解,可閱讀《C語(yǔ)言數(shù)據(jù)輸出大匯總》一節(jié),這里不做詳細(xì)贅述。
C++ 通常使用 cout 輸出數(shù)據(jù),和 printf() 函數(shù)相比,cout 實(shí)現(xiàn)格式化輸出數(shù)據(jù)的方式更加多樣化。一方面,cout 作為 ostream 類的對(duì)象,該類中提供有一些成員方法,可實(shí)現(xiàn)對(duì)輸出數(shù)據(jù)的格式化;另一方面,為了方面用戶格式化輸出數(shù)據(jù),C++ 標(biāo)準(zhǔn)庫(kù)專門提供了一個(gè) <iomanip> 頭文件,該頭文件中包含有大量的格式控制符(嚴(yán)格意義上稱為“流操縱算子”),使用更加方便。
C++ cout成員方法格式化輸出
《C++輸入流和輸出流》一節(jié)中,已經(jīng)針對(duì) cout 講解了一些常用成員方法的用法。除此之外,ostream 類中還包含一些可實(shí)現(xiàn)格式化輸出的成員方法,這些成員方法都是從 ios 基類(以及 ios_base 類)中繼承來的,cout(以及 cerr、clog)也能調(diào)用。
表 1 羅列了 ostream 類中可實(shí)現(xiàn)格式化輸出的常用成員方法,以及它們各自的用法。
其中,對(duì)于表 1 中 flags() 函數(shù)的 fmtfl 參數(shù)、setf() 函數(shù)中的 fmtfl 參數(shù)和 mask 參數(shù)以及 unsetf() 函數(shù) mask 參數(shù),可以選擇表 2 中列出的這些值。
舉個(gè)例子:
#include <iostream> using namespace std; int main() { double a = 1.23; //設(shè)定后續(xù)輸出的浮點(diǎn)數(shù)的精度為 4 cout.precision(4); cout <<"precision: "<< a << endl; //設(shè)定后續(xù)以科學(xué)計(jì)數(shù)法的方式輸出浮點(diǎn)數(shù) cout.setf(ios::scientific); cout <<"scientific:"<< a << endl; return 0; }
程序執(zhí)行結(jié)果為:
precision: 1.23
scientific:1.2300e+00
注意,當(dāng) cout 采用此方式進(jìn)行格式化輸出時(shí),其后不能立即輸出數(shù)據(jù),而只能像示例程序中那樣,再用一個(gè) cout 輸出數(shù)據(jù)。
值得一提的是,當(dāng)調(diào)用 unsetf() 或者 2 個(gè)參數(shù)的 setf() 函數(shù)時(shí),為了提高編寫代碼的效率,可以給 mask 參數(shù)傳遞如下 3 個(gè)組合格式:
ios::adjustfield:等價(jià)于 ios::left | ios::right | ios::internal;
ios::basefield:等價(jià)于 ios::dec | ios::oct | ios::hex;
ios::floatfield:等價(jià)于 ios::scientific | ios::fixed。
舉個(gè)例子:
#include <iostream> using namespace std; int main() { double f = 123; //設(shè)定后續(xù)以科學(xué)計(jì)數(shù)法表示浮點(diǎn)數(shù) cout.setf(ios::scientific); cout << f << '\n'; //刪除之前有關(guān)浮點(diǎn)表示的設(shè)定 cout.unsetf(ios::floatfield); cout << f; return 0; }
程序執(zhí)行結(jié)果為:
1.230000e+02
123
使用流操縱算子格式化輸出
表 3 羅列了 <iomanip> 頭文件中定義的一些常用的格式控制符,它們都可用于格式化輸出。
注意:“流操縱算子”一欄帶有星號(hào) * 的格式控制符,默認(rèn)情況下就會(huì)使用。例如在默認(rèn)情況下,整數(shù)是用十進(jìn)制形式輸出的,等效于使用了 dec 格式控制符。
和 cout 成員方法的用法不同,下面程序演示了表 3 中這些格式控制符的用法:
#include <iostream> #include <iomanip> using namespace std; int main() { //以十六進(jìn)制輸出整數(shù) cout << hex << 16 << endl; //刪除之前設(shè)定的進(jìn)制格式,以默認(rèn)的 10 進(jìn)制輸出整數(shù) cout << resetiosflags(ios::basefield)<< 16 << endl; double a = 123; //以科學(xué)計(jì)數(shù)法的方式輸出浮點(diǎn)數(shù) cout << scientific << a << endl; //刪除之前設(shè)定的科學(xué)計(jì)數(shù)法的方法 cout << resetiosflags(ios::scientific) << a << endl; return 0; }
程序執(zhí)行結(jié)果為:
10
16
1.230000e+02
123
注意,如果兩個(gè)相互矛盾的標(biāo)志同時(shí)被設(shè)置,如先設(shè)置 setiosflags(ios::fixed),然后又設(shè)置 setiosflags(ios::scientific),那么結(jié)果可能就是兩個(gè)標(biāo)志都不起作用。因此,在設(shè)置了某標(biāo)志,又要設(shè)置其他與之矛盾的標(biāo)志時(shí),就應(yīng)該用 resetiosflags 清除原先的標(biāo)志。
以上就是C++ 的cout格式化輸出的詳細(xì)內(nèi)容,更多關(guān)于C++ 的cout格式化輸出的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言連續(xù)生成多個(gè)隨機(jī)數(shù)實(shí)現(xiàn)可限制范圍
這篇文章主要介紹了C語(yǔ)言連續(xù)生成多個(gè)隨機(jī)數(shù)實(shí)現(xiàn)可限制范圍,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01C++學(xué)習(xí)進(jìn)階篇之類大小計(jì)算和this指針
this是C++中的一個(gè)關(guān)鍵字,也是一個(gè)const指針,它指向當(dāng)前對(duì)象,通過它可以訪問當(dāng)前對(duì)象的所有成員,下面這篇文章主要給大家介紹了關(guān)于C++學(xué)習(xí)進(jìn)階篇之類大小計(jì)算和this指針的相關(guān)資料,需要的朋友可以參考下2023-04-04

C 標(biāo)準(zhǔn)I/O庫(kù)的粗略實(shí)現(xiàn)教程

C++實(shí)現(xiàn)LeetCode(187.求重復(fù)的DNA序列)

C++面試八股文之如何實(shí)現(xiàn)strncpy函數(shù)

C#復(fù)制和深度復(fù)制的實(shí)現(xiàn)方法

純c語(yǔ)言優(yōu)雅地實(shí)現(xiàn)矩陣運(yùn)算庫(kù)的方法