字串和 I/O 格式化 (現代 C++)
C++ < iostream > 類別、函式和運算子支援格式化字串 I/O。 例如,下列程式碼示範如何將 整數格式化 cout
為十六進位輸出。 首先,它會儲存目前的狀態,以在之後重設它,因為一旦將格式狀態傳遞至 cout
,它會保持該方式,直到變更為止。 它不只是套用至一行程式碼。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
ios state(nullptr);
cout << "The answer in decimal is: " << 42 << endl;
state.copyfmt(cout); // save current formatting
cout << "In hex: 0x" // now load up a bunch of formatting modifiers
<< hex
<< uppercase
<< setw(8)
<< setfill('0')
<< 42 // the actual value we wanted to print out
<< endl;
cout.copyfmt(state); // restore previous formatting
}
此方法是型別安全且可延伸,但也是複雜且詳細的方法。
替代格式選項
或者,您可以從 Boost C++ 程式庫使用 Boost.Format
,即使它不是標準。 您可以從 Boost 網站下載任何 Boost 程式庫 。
的 Boost.Format
一些優點如下:
保管庫:型別安全,並針對錯誤擲回例外狀況,例如,規格太少或太多專案。
可延伸:適用于可串流的任何類型。
方便:標準 POSIX 和類似的格式字串。
雖然 Boost.Format
建置在安全且可延伸的 C++ < iostream > 設施上,但效能並未優化。 當您需要效能優化時,請考慮 C printf 和 sprintf ,這是快速且容易使用的。 不過,它們不是可延伸或安全的弱點。 (保管庫版本存在,但會產生輕微的效能損失。如需詳細資訊,請參閱 printf_s、_printf_s_l、wprintf_s、_wprintf_s_l 和 sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l )。
下列程式碼示範一些 Boost 格式設定功能。
string s = str( format("%2% %2% %1%\n") % "world" % "hello" );
// s contains "hello hello world"
for( auto i = 0; i < names.size(); ++i )
cout << format("%1% %2% %|40t|%3%\n") % first[i] % last[i] % tel[i];
// Georges Benjamin Clemenceau +33 (0) 123 456 789
// Jean de Lattre de Tassigny +33 (0) 987 654 321
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應