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