C++ の iostream フォーマット指定早見表

C++ の iostream ってなぜ printf() ほどメジャーじゃないんだろう。 << がキモいから? iostream の書式指定まわりが覚えづらいから?それでも、できれば iostream でスマートに書いてみたいものです。

C (stdio) / C++ (iostream) 出力フォーマット指定対応表

そこで、 C (stdio) と C++ (iostream) の出力フォーマット指定の対応表を作ってみました。「printf()ではこう書くけど、 iostream ではどうやって書くんだっけ?」みたいなとき用。

C (stdio) C++ (iostream) 出力結果
整数 8進表記 printf(“%o”, 42);
printf(“%#o”, 42);
cout << oct << 42;
cout << oct << showbase << 42;
52
052
整数 10進表記 printf(“%d”, 42); cout << dec << 42; 42
整数 16進表記 printf(“%x”, 42);
printf(“%#X”, 42);
cout << hex << 42;
cout << hex << showbase << uppercase << 42;
2a
0X2A
浮動小数点数 デフォルト cout << 3.1415; 3.1415
浮動小数点数 固定小数点表記 printf(“%f”, 3.1415);
printf(“%.2f”, 3.1415);
cout << fixed << 3.1415;
cout << fixed << setprecision(2) << 3.1415;
3.141500
3.14
浮動小数点数 指数表記 printf(“%e”, 3.1415);
printf(“%.2E”, 3.1415);
cout << scientific << 3.1415;
cout << scientific << setprecision(2) << uppercase << 3.1415;
3.141500+e000
3.14+E000
左寄せ
右寄せ
符号以外右寄せ
printf(“%5d”, -42);
printf(“%-5d”, -42);
cout << setw(5) << left << -42;
cout << setw(5) << right << -42;
cout << setw(5) << internal << -42;
42___
__-42
-__42
0埋め printf(“%05d”, 42); cout << setfill(‘0′) << setw(5) << right << 42; 00042
正の符号 printf(“%+d”, 42); cout << showpos << 42; +42
小数点 printf(“%#.0f”, 42.0);
printf(“%.4f”, 42.0);
cout << noshowpoint << 42.0;
cout << showpoint << 42.0;
42
42.0000

iostream での書式指定の方法は複数ありますが、ここではマニピュレータで書式指定をしています。マニピュレータを使用するにはヘッダファイル <iomanip> を #include する必要があります。

フラグの種類とマニピュレータ

マニピュレータは、操作するフラグの種類で括ることができます。例えば、マニピュレータ noshowpoint, showpoint は、小数点表示フラグを操作するものです。

フラグの種類とそれに対応するマニピュレータを次表にまとめました。太字で示すマニピュレータは、デフォルトの状態に戻すためのマニピュレータです。

フラグの種類 マニピュレータ
基数の表示 noshowbase, showbase
小数点の表示 noshowpoint, showpoint
正の符号の表示 noshowpos, showpos
大文字での表示 nouppercase, uppercase
基数の種類
(basefield フラグ)
oct, dec, hex
浮動小数点数の表記
(floatfield フラグ)
fixed, scientific (*)
左寄せ/右寄せ
(adjustfield フラグ)
left, right, internal

(*) デフォルトの状態に戻すマニピュレータはないため、デフォルトの状態に戻すには cout << resetiosflags(ios_base::floatfield); のようにします。

結論

こうして見ると、 printf() に比べて iostream ってやっぱりちょっと複雑だなー。

本記事では名前空間 (std::) の表記を省略しています。本記事の作成にあたっては cplusplus.com, JM Project を参照しました。