「C++のiostreamのフォーマット指定」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「画面表示、ファイルへの出力など、いろいろなシーンで、文字列をフォーマットしたい、という需要があります。C言語で言え...」)
 
(相違点なし)

2015年11月3日 (火) 18:05時点における最新版

画面表示、ファイルへの出力など、いろいろなシーンで、文字列をフォーマットしたい、という需要があります。C言語で言えば、printfファミリーです。C++言語でも、また使いたくなるのは、cstdioのprintfファミリーかもしれません。C++のiostreamにもフォーマットするための機能が用意されています。std::coutと組み合わせて、使用できます。もうprintfは卒業できます。

読み方

iostream
あいおーすとりーむ

概要

C++言語になっても、C言語由来の

などを使い続けているコードを見かけることがあります。

C++言語には、

  • iostream
  • sstream
  • boost::format

などがあります。

ヘッダファイル

マニピュレータを利用するときは、iomainip をインクルードします。

#include <iomanip>

8進数、10進数、16進数

printfとiostreamのフォーマット指定子の例
フォーマット C言語 stdio C++ iostream 出力
整数8進数 printf("%o", 12); cout<<oct<<12; 14
整数8進数 printf("%#o", 12); cout<<oct<<12; 014
整数10進数 printf("%d", 12); cout<<dec<<12; 12
整数16進数 printf("%x", 12); - c
整数16進数 printf("%X", 12); - C
整数16進数 printf("%#x", 12); cout<<hex<<12; 0xc
整数16進数 printf("%#x", 12); cout<<hex<<uppercase<<12; 0xC

符号

printfとiostreamの左寄せと右寄せ
フォーマット C言語 stdio C++ iostream 出力
正の符号 printf("%+5d", 12); cout<<showpos<<12; +12

浮動小数点の扱い

printfとiostreamの浮動小数点
フォーマット C言語 stdio C++ iostream 出力
デフォルト - cout<<3.1415; 3.14
浮動小数点 printf("%f", 3.1415); cout<<fixed<<3.1415; 3.141500
固定小数点表記 printf("%.2f", 3.1415); cout<<fixed<<setprecision(2)<<3.1415; 3.14

小数点の扱い

printfとiostreamの小数点
フォーマット C言語 stdio C++ iostream 出力
小数点以下の0を表示しない printf("%.0f", 3.000); cout<<noshowpoint<<3.000; 3
小数点以下の0を表示する printf("%.5f", 3.000); cout<<showpoint<<3.000; 3.00000
桁指定 - cout.precision(4);cout<<showpoint<<3.000; 3.00000

指数形式

printfとiostreamの指数形式
フォーマット C言語 stdio C++ iostream 出力
指数形式 printf("%e", 3.1415); cout<<scientific<<3.1415; 3.141500e++00
指数形式(大文字) printf("%E", 3.1415); cout<<scientific<<uppercase<<3.1415; 3.141500E++00.00000
桁指定 - cout.precision(4);cout<<showpoint<<3.000; 3.00000

0などで埋める

printfとiostreamの 0 埋めなど
フォーマット C言語 stdio C++ iostream 出力
0埋め printf("%05d", -12); cout<<swet(5)<<setfill('0')<<-12 -__12
任意の文字で埋める - cout<<swet(5)<<setfill('*')<<-12 -**12

左寄せと右寄せ

printfとiostreamの左寄せと右寄せ
フォーマット C言語 stdio C++ iostream 出力
左寄せ printf("%-5d", -12); cout<<setw(5)<<left<<-12; -12__
右寄せ printf("%5d", -12); cout<<swetw(5)<<right<<-12; __-12
符号以外右寄せ - cout<<swetw(5)<<internal<<-12; -__12
0埋め printf("%05d", -12); cout<<swet(5)<<setfill('0')<<-12 -__12

マニピュレータをデフォルトの状態に戻す方法

マニピュレータで変更した内容を元に戻すには、以下の方法でリセットします。

cout << resetiosflags(ios_base::floatfield);

エラー

$ c++ iostream_format_place.cpp 
iostream_format_place.cpp: In function ‘int main(int, const char**)’:
iostream_format_place.cpp:11:16: error: ‘setw’ was not declared in this scope
  cout << setw(5) << left << 12;

マニピュレータを利用するときは、iomainip をインクルードします。

#include <iomanip>

まとめ

このように、C++でも、printfファミリでできることが iostreamのマニピュレータを利用することで実現できます。使いにくいと思われるかもしれませんが、慣れるまでの辛抱です。

関連項目