2018年03月30日
《その353》setf関数
setf関数,unsetf関数
fmtflags setf(fmtflags x);
書式制御情報に x を加え(更新ではありません)、加える前の書式制御情報を返却します。
void unsetf(fmtflags x);
書式制御情報 x を消去します。
以下、順を追って、プログラムを説明します。
★1.
最初に、C++ のデフォルトの書式制御情報のままで、d の値を出力します。
C++ のデフォルトの書式制御情報では、ios_base::dec, ios_base::skipws の2つがセットされています。
次に、
ios_base::fmtflags f0
= cout.setf(ios_base::scientific);
として、浮動小数点数の出力を、指数付き記法で行うように設定します。
f0 には、設定前の書式制御情報が代入されます。
ここで、f0 のビット構成を画面出力しますが、これは、変更前の、デフォルトの書式制御情報です。
最後に、
cout.unsetf(ios_base::dec);
で、ios_base::dec を除去します。これは、★2.で ios_base::scientific をセットする際に、ios_base::dec のビットがそのまま残ってしまうからです。
setf関数によるセットは、更新ではなく、加える形の変更です。
★2.
まず、指数付き記法で d の値を出力します。
次に、
ios_base::fmtflags f1
= cout.setf(ios_base::fixed);
として、浮動小数点数の出力を、固定小数点記法で行うように設定します。
f1 には、設定前の書式制御情報が代入されます。
ここで、f1 のビット構成を画面出力しますが、これは、指数付き記法の書式制御情報です。
最後に、
cout.unsetf(ios_base::scientific);
で、ios_base::scientific を除去します。
★3.
固定小数点記法で d の値を出力します。
次に、
ios_base::fmtflags f2
= cout.setf(f0);
として、最初の設定に戻します。
f2 には、戻す前の書式制御情報が代入されます。
ここで、f2 のビット構成を画面出力しますが、これは、固定小数点記法の書式制御情報です。
最後に、
cout.unsetf(ios_base::fixed);
で、ios_base::fixed を除去します。
★4.
最初の書式制御情報に戻っていることを、d の値と書式制御情報のビット構成を画面出力して確認します。
以下は、プログラムです。
#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";
cout << d << '\n';
ios_base::fmtflags f0
= cout.setf(ios_base::scientific);
cout << bits_of(f0) << "\n\n";
cout.unsetf(ios_base::dec);
cout << "★2.\n";
cout << d << '\n';
ios_base::fmtflags f1
= cout.setf(ios_base::fixed);
cout << bits_of(f1) << "\n\n";
cout.unsetf(ios_base::scientific);
cout << "★3.\n";
cout << d << '\n';
ios_base::fmtflags f2 = cout.setf(f0);
cout << bits_of(f2) << "\n\n";
cout.unsetf(ios_base::fixed);
cout << "★4.\n";
cout << d << '\n';
cout << bits_of(cout.flags())
<< '\n';
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7495823
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック