2018年03月23日
《その346》ios_baseクラス(1)
fmtflags型
<ios>ヘッダが提供する ios_baseクラスは、ストリームに関するすべてのクラスの最上位基底クラスです。
ios_baseクラスで定義されている型には、
fmtflags型
iostate型
openmode型
seekdir型
があります。
今回のプログラムでは、これらのうち、fmtflags型について、その働きをチェックしています。
プログラムでは、fmtflags型の要素のうち、以下のものを利用します。
showpos (非負数値に + を付加して出力)
boolalpha (bool型を true, false で入出力)
hex (整数を 16進表記で入出力)
dec (整数を 10進表記で入出力)
fmtflags型の要素は、特定のビットのみが 1 になっていて、書式制御部分の対応するビットを 1 にすることで、その効果が得られるようになっています。
以下は、プログラムの説明です。
プログラムは、ofstream型に関して、その最上位基底クラス ios_base で定義されている fmtflags型の働きを見るものです。
最初に、text.txt を切捨てモードでオープンします。
ofstream fos("text.txt");
以下、
setf関数
を使って、showpos, boolalpha, hex, dec の順に設定し、
flags関数
で、書式制御部分のビットの変化を確認します。
なお、設定の解除には、
unsetf関数
を利用しています。
最後に、showpos, boolalpha, hex をそれぞれセットした際に、text.txtファイルにサンプル出力したものを、確認のために画面表示しています。
#include <fstream>
#include <string>
#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() {
ofstream fos("text.txt");
if (!fos) {
cout << "ファイルをオープンできま"
"せん。\n";
exit(1);
}
cout << "◆最初の書式制御情報\n";
cout << bits_of(fos.flags()) << "\n\n";
cout << "◆(1)書式変更:非負数値に + を付加して出力\n";
cout << "fos.setf(ios_base::showpos);\n";
fos.setf(ios_base::showpos);
cout << bits_of(fos.flags()) << '\n';
fos << "(1)の出力例\n" << true << ", " << false << '\n';
cout << "変更を解除\n";
cout << "fos.unsetf(ios_base::showpos);\n";
fos.unsetf(ios_base::showpos);
cout << bits_of(fos.flags()) << "\n\n";
cout << "◆(2)書式変更:bool型を true, false で出力\n";
cout << "fos.setf(ios_base::boolalpha);\n";
fos.setf(ios_base::boolalpha);
cout << bits_of(fos.flags()) << '\n';
fos << "\n(2)の出力例\n" << true << ", " << false << '\n';
cout << "変更を解除\n";
cout << "fos.unsetf(ios_base::boolalpha);\n";
fos.unsetf(ios_base::boolalpha);
cout << bits_of(fos.flags()) << "\n\n";
cout << "◆(3)書式変更:整数を 16進表記で出力\n";
cout << "fos.setf(std::ios_base::hex, "
"ios_base::basefield);\n";
fos.setf(std::ios_base::hex,
ios_base::basefield);
cout << bits_of(fos.flags()) << '\n';
fos << "\n(3)の出力例\n" << 2748 << '\n';
cout << "変更を解除(10進表記に戻す)\n";
cout << "fos.setf(std::ios_base::dec, "
"ios_base::basefield);\n";
fos.setf(std::ios_base::dec,
ios_base::basefield);
cout << bits_of(fos.flags()) << "\n\n";
cout << "◆整数を 10進表記で出力 かつ\n";
cout << " 非負数値に + を付加して出力 かつ\n";
cout << " bool型を true, false で出力 の状態\n";
cout << "fos.setf(ios_base::boolalpha);\n";
cout << "fos.setf(ios_base::showpos);\n";
fos.setf(ios_base::boolalpha);
fos.setf(ios_base::showpos);
cout << bits_of(fos.flags()) << "\n\n";
fos.close();
ifstream fis("text.txt");
if (!fis) {
cout << "ファイルをオープンできま"
"せん。\n";
exit(1);
}
while (1) {
string tmp;
getline(fis, tmp);
if (!fis) break;
cout << tmp << '\n';
}
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7468201
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック