下面這段程式是c#中如何進行字串格式的程式碼片段:1 Console.WriteLine(string.Format("{0} is {1} is {2}", 1, "dxfcv222", 123.45678f));
2
大家可以看到,簡單明了非常好用。format函數甚至允許多個位置採用相同的參數,比如:1 Console.WriteLine(string.Format("{0} is {1} is {1}", 1, "dxfcv222", 123.45678f));
2
在c++中串格式化函數就沒那麼好用了。下面給出一段c++中進行串格式化的代碼:
1 char buffer3[256];
2 sprintf(buffer3, "%5d is % 5.6s is %-7.2f", 1, "1234567", 12.34567);
3 cout << buffer3 << endl;
4
大家可以看到,這樣一段代碼,其實問題是很多的。1。我們申請了一個緩衝區,其大小是256,該緩衝區如果開大了造成資源浪費,如果開小了那肯定會異常,多麼頭疼的問題。2。無法在編譯期檢測出格式化串輸入錯誤問題,比如我們把"%5d is % 5.6s is %-7.2f"錯輸入為"%5a is % 5.6s is %-7.2f"這個錯誤只有在程式崩潰的時候才能夠暴露出來。3。易用性不好。
為此,我寫了個格式化串的類FormatString,其出發點就是在c++中類比c#中串格式化文法,減少出錯可能性,提高易用性。其典型使用程式碼片段如下:1string buffer = FormatString("scene\\{0}.ini") << serial << OVER;
缺點是效率不高,能處理的情況也很有限(只能處理基礎資料型別 (Elementary Data Type)) 。無法設定參數格式化精度和輸出樣式(比如靠左對齊,局中對齊等),輸入鍵台等。
下面向大家介紹我們今天的明星,boost/format~~~~~~~~~~~~~~~~~~~~~`。
format 類型是boost庫中包含的一個用來格式化串的類型。該類型相容了c風格的
串格式化格式,同時也提供了一套更加直觀的boost 風格的串格式化格式。另外該類型提供了一些printf()函數不支援的特性,比如輸入參數局中顯式,使用者自訂類型格式化輸出等。下面給出部分使用程式碼片段:
1 //c 風格的格式化。
2 cout << format("%5d is % 5.6s is %-7.2f") % 1 % "1234567" % 12.34567 << endl;
3
1 //boost 風格格式化。
2 cout << format("%1% is %2% is %3%") % 1
3 % 1.234f
4 % "dxfcv222" << endl;
有興趣的朋友可以到 boost 網站查詢關於 format 類型的更多資訊。網址如下:
http://www.boost.org。