アフィリエイト広告を利用しています

広告

posted by fanblog

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';
}
}

h12_0012.png




この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7468201
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。