2018年03月30日
《その352》flags関数
flags関数
fmtflags flags() const;
この形式の flags関数は、基底クラス ios_base に設定されているビットマスク型の書式制御情報を返却します。
fmtflags flags(fmtflags x);
この形式の flags関数は、基底クラス ios_base に設定されている書式制御情報を x に変更し、変更後の値を返却します。
以下、順を追って、プログラムを説明します。
★1.
ios_base::fmtflags f = cout.flags();
C++ の規定の fmtflags型書式制御情報を f に読み込みます。
そして、確認のため、そのビット構成と d の値を画面出力します。
★2.
cout.flags(ios_base::scientific | ios_base::skipws);
として、浮動小数点数の出力を、指数付き記法で行うように設定します。
やはり、確認のため、そのビット構成と d の値を画面出力します。
ここで、
ios_base::skipws
の指定は、特定の場合の読み込み時に空白文字を無視するようにするものです。
ここで指定する必要はありませんが、わざわざ指定した理由は、この指定をしないと書式制御情報のビット構成の第 0ビットが 0 になってしまい、浮動小数点数の出力と無関係の設定変更が同時に行われてしまうからです。
★3.
浮動小数点数の出力を、固定小数点記法で行うように設定します。
やはり、確認のため、そのビット構成と d の値を画面出力します。
★4.
cout.flags(f);
f に代入しておいた最初の書式制御情報を、セットします。
最後に、元通りの出力書式に戻っていることを確認します。
以下は、プログラムです。
#include <iostream>
using namespace std;
const unsigned bits
= numeric_limits<unsigned int>::digits;
const char* bits_of(unsigned x) {
static char str[bits + 1];
unsigned n = bits;
for (unsigned i = 0; i < n; i++) {
if ((x >> i) & 1U)
str[n - i - 1] = '1';
else
str[n - i - 1] = '0';
}
str[n] = '\0';
return str;
}
int main() {
double d = 123.456 * 123.456;
cout << "★1.\n";
ios_base::fmtflags f = cout.flags();
cout << bits_of(f) << '\n';
cout << d << "\n\n";
cout << "★2.\n";
cout.flags(ios_base::scientific
| ios_base::skipws);
cout << bits_of(cout.flags())
<< '\n';
cout << d << "\n\n";
cout << "★3.\n";
cout.flags(ios_base::fixed
| ios_base::skipws);
cout << bits_of(cout.flags())
<< '\n';
cout << d << "\n\n";
cout << "★4.\n";
cout.flags(f);
cout << bits_of(cout.flags())
<< '\n';
cout << d << '\n';
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7495248
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック