Boost.Format
The Boost Format library - 1.47.0
型、引数の数安全なprintf的なもの
basic_format class
以下のようにtypedefされてる
typedef basic_format<char> format; typedef basic_format<w_char> wformat;
使い方1(基本)
boost::format(format) % arg1 % arg2 ...
formatには、printfと同じ%〜形式のやつをいれる
使い方2(n番目の引数を指定)
formatに%n%と指定するとn番目の引数がそこに入る
使い方3(printf形式と%n%の併用)
formatに%n$〜を指定して併用可。
整形済み文字列を文字列型に変更
f.str();
boost::io::str(f) //boost::io空間
iostreamのマニピュレータを使用
group関数をbasic_formatのoperator%に渡す.
boost::io::group( Manip1, arg )
boost::io::group( Manip1, Manip2, arg )
...
10個まで定義済み
例外
//※boost::io空間 class format_error :public std::exception; //全Boost.Formatの全例外を受け取る時に使う class bad_format_string :public format_error; class too_few_args :public format_error; class too_many_args :public format_error; class out_of_range :public format_error;
エラー発生時に例外を投げるか,単に失敗するかをビットで指定
//boost::basic_formatのメンバ unsigned char exceptions( unsigned char newexcept ); unsigned char exceptions() const; //boost::io空間 enum boost::io::format_error_bits{ bad_format_string_bit = 1; too_few_args_bit = 2; too_many_args_bit = 4; out_of_range_bit = 8; all_error_bits = 255; //以上の全エラーで例外を投げる no_error_bit = 0; //以上の全エラーで例外を投げない }
format_TEST.cpp
#include <iostream> #include <string> #include <boost/format.hpp> namespace err{ enum{ JP, EN, NUM_LANG}; enum{ SECTION_BROKEN, NOT_FOUND, NUM_ERROR}; static char* message[NUM_ERROR][NUM_LANG] = { { "ファイル'%1%'の'%2%'セクションが壊れています", "'%2%' section in file '%1%' corrupted." }, { "実行可能な'%1%'が見つかりませんでした", "No '%1%' executable found there." } }; } //namespace err int main(){ try{ std::string test = "テスト"; //printf形式 std::cout << boost::format("test string = '%s' ") % test; for(size_t i=0; i<test.size(); ++i) std::cout << boost::format("[%#02x]") % (test[i]&0xff); std::cout << std::endl; //%n%、n番目の引数を指定できる std::string file = "a.out", section = ".lib"; int lang = err::JP; std::cout << boost::format(err::message[err::NOT_FOUND][lang]) % file << std::endl << boost::format(err::message[err::SECTION_BROKEN][lang]) % file % section << std::endl; lang = err::EN; std::cout << boost::format(err::message[err::NOT_FOUND][lang]) % file << std::endl << boost::format(err::message[err::SECTION_BROKEN][lang]) % file % section << std::endl; //%n$〜 でprintf形式と併用 std::cout << boost::format("hex=%1$x octal=%1$o decimal=%1$d \n") % 255; //文字列化 std::cout << (boost::format("hex=%1$#x ") % 255).str() + "文字列化" << std::endl; std::cout << boost::io::str( boost::format("hex=%1$#x ") % 255 ) + "これでもおkだがboost::io空間にある" << std::endl; //iostreamのマニピュレータも使える std::cout << boost::format("std::hexで16進数に %1%") % boost::io::group(std::hex, 255); }catch( boost::io::format_error& e){ //※boost::io空間 std::cerr << e.what() << std::endl; } return 0; }
結果
test string = 'テスト' [0x83][0x65][0x83][0x58][0x83][0x67] 実行可能な'a.out'が見つかりませんでした ファイル'a.out'の'.lib'セクションが壊れています No 'a.out' executable found there. '.lib' section in file 'a.out' corrupted. hex=ff octal=377 decimal=255 hex=0xff 文字列化 hex=0xff これでもおkだがboost::io空間にある std::hexで16進数に ff