「C++のiostreamのフォーマット指定」の版間の差分
提供: C++入門
(ページの作成:「画面表示、ファイルへの出力など、いろいろなシーンで、文字列をフォーマットしたい、という需要があります。C言語で言え...」) |
(相違点なし)
|
2015年11月3日 (火) 18:05時点における最新版
画面表示、ファイルへの出力など、いろいろなシーンで、文字列をフォーマットしたい、という需要があります。C言語で言えば、printfファミリーです。C++言語でも、また使いたくなるのは、cstdioのprintfファミリーかもしれません。C++のiostreamにもフォーマットするための機能が用意されています。std::coutと組み合わせて、使用できます。もうprintfは卒業できます。
読み方
- iostream
- あいおーすとりーむ
目次
概要
C++言語になっても、C言語由来の
- printf
- fprintf
- sprintf / snprintf
などを使い続けているコードを見かけることがあります。
C++言語には、
- iostream
- sstream
- boost::format
などがあります。
ヘッダファイル
マニピュレータを利用するときは、iomainip をインクルードします。
#include <iomanip>
8進数、10進数、16進数
フォーマット | 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 |
符号
フォーマット | C言語 stdio | C++ iostream | 出力 |
---|---|---|---|
正の符号 | printf("%+5d", 12); | cout<<showpos<<12; | +12 |
浮動小数点の扱い
フォーマット | 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 |
小数点の扱い
フォーマット | 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 |
指数形式
フォーマット | 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などで埋める
フォーマット | C言語 stdio | C++ iostream | 出力 |
---|---|---|---|
0埋め | printf("%05d", -12); | cout<<swet(5)<<setfill('0')<<-12 | -__12 |
任意の文字で埋める | - | cout<<swet(5)<<setfill('*')<<-12 | -**12 |
左寄せと右寄せ
フォーマット | 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のマニピュレータを利用することで実現できます。使いにくいと思われるかもしれませんが、慣れるまでの辛抱です。