• ベストアンサー

標準C++ iostream での printf ライクな文字列書式整形

ちらっと聞きかじったことがあるのですが、 最近、標準C++のiostreamに、従来のprintfによく似た 書式指定文字列 と 可変数の引数 による文字列整形 ができる機能(?)/マニピュレータ(?)が追加された、とか。 具体的な情報をご存知の方、教えていただけませんか。 iostreamで書式整形する場合、setfill, setw, ... のマニピュレータを 駆使してやりくりするのは、とても面倒だし、覚えられません。 自分にはprintfの方が使いやすいです。 ・・・このような理由で、上記の、iostream での printfライクな 文字列書式整形方法を探しています。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

vsprintfを使って std::string format(const char* fmt, ...) をこしらえればいい。そんなに面倒じゃありません。

typingduck
質問者

お礼

お礼が遅くなりました。 ありがとうございます。 vsprintfを使うんですね。やってみます。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

#1の方も回答されていますが、boost::formatを使うのがよいと思います。formatに限れば、主要な処理系で使えますので、導入に際しての問題も少ないはずです。 ざっと、使用例を書くと、 double x = 1.234; std::string str("abc"); std::cout << boost::format("%10.3f, %-16s") % x % str << std::endl; といった具合です。 printfと違って、std::stringも使えますし、longだから"%ld"にするとかの面倒くささもありません。 逆にprintfではできて、boost::formatではできない機能としては、"%n"が使えないことと、"%lc"や"%ls"のようにしてもワイド文字(列)が使えないことです。 ワイド文字(列)に関しては、boost::wformatにすれば使えますが、今度はナロー文字(列)が使えなくなります。(もっとも、operator<<(std::ostream&, const wchar_t&)などを多重定義すればよいのでしょうが...)

参考URL:
http://www.boost.org/
typingduck
質問者

お礼

お礼が遅くなりました。 ありがとうございます。 やはりboostですか。存在は知っていたのですが。 使い方や制限事項も書いてくださって、助かります。 問題は、いま使っているコンパイラが boost を受け付けてくれるかどうか。 折を見て、やってみますね。

すると、全ての回答が全文表示されます。
  • floor101
  • ベストアンサー率28% (2/7)
回答No.1

可変引数ではないと思いますが、boost::formatならば かなりのレベルでご期待の機能を満たしているはずです。 最新のコンパイラを使わないと、コンパイルが通らない事がありますので、退行テストのリンクも辿ってみ て下さい。 退行テストのリンクはこちら http://engineering.meta-comm.com/boost-regression/CVS-HEAD/developer/format.html

参考URL:
http://www.boost.org/libs/format/doc/format.html
typingduck
質問者

お礼

お礼が遅くなりました。 ありがとうございます。 退行テスト(=回帰テスト?)のページも参考になりました。 わたしが使っているコンパイラは載ってない・・・ 折を見て、boostをインストールしてみます。

すると、全ての回答が全文表示されます。

関連するQ&A