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

広告

posted by fanblog

2018年04月06日

《その355》バイナリモード


 バイナリモードでの実数値の読み書き

 下記のプログラムでは、
テキストモードでのファイルの読み書き
バイナリモードでのファイルの読み書き
を行っていますが、プログラムを見やすくするために、ファイルのオープンに失敗した場合の処置は省略してあります

★1.
 const unsigned bits は char型のビット数です。

★2.
 関数 bits_of は char型の値を受け取り、それを'1', '0'の並びの string型文字列にして返却します。

以下、main関数です。

★3.
double d = 0.6;
0.6 は 2進数で表すと無限小数になります。
cout << setprecision(20) << d;
精度 20 は、double型数値の 10進数有効桁数を超えています。

★4.
 ここでは、テキストモードで、実数値の書き出し・読み込み を行っています。
テキストモードの場合は、データを文字の並びとして、読み書きします。
0.6 であれば、「 0 」「 . 」「 6 」が、この順にファイルに書き込まれます。

★5.
 ここでは、バイナリモードで、実数値の書き出し・読み込み を行っています。
バイナリモードの場合は、データをビットの並びとして、読み書きします。
0.6 であれば、その2進数表現がファイルに書き込まれます。
ofstream fos2("dbl.bin", ios_base::binary);
 ファイル "dbl.bin" をバイナリモードでオープンします。
fos2.write(reinterpret_cast<char*>(&d), sizeof(double));
 &d の位置から sizeof(double)分のデータをビットの並びとしてファイルに書き込みます。
fis2.read(reinterpret_cast<char*>(&d_2), sizeof(double));
 &d_2 の位置に sizeof(double)分のデータをビットの並びとして読み込みます。この操作で、d_2 にファイルの実数値が代入されます。

★6.
 ここでは、バイナリモードでファイルから読み込んだビットの並びを、そのまま string型文字列にして表示しています。
出力結果は、ファイルに格納されていた 0.6 のビットの並びです。
本ブログの《349》と《350》で、実数 0.6 の内部表現を調べましたが、その結果と一致していることが確認できます。


#include <iomanip>
#include <string>
#include <fstream>
#include <iostream>
using namespace std;

// ★1.
const unsigned bits
= numeric_limits<unsigned char>::digits;

// ★2.
string bits_of(char x) {
string temp;

for (unsigned i = 0; i < bits; i++) {
if ((x >> i) & 1U)
temp = '1' + temp;
else
temp = '0' + temp;
}
temp += '\0';
return temp;
}

int main() {
cout << "★3. ";
double d = 0.6;
cout << setprecision(20) << d << '\n';

cout << "★4. ";
ofstream fos1("dbl.txt");
fos1 << setprecision(20) << d;
fos1.close();

double d_1;
ifstream fis1("dbl.txt");
fis1 >> d_1;
cout << setprecision(20) << d_1 << '\n';
fis1.close();

cout << "★5. ";
ofstream
fos2("dbl.bin", ios_base::binary);
fos2.write(
reinterpret_cast<char*>(&d),
sizeof(double)
);
fos2.close();

double d_2;
ifstream
fis2("dbl.bin", ios_base::binary);
fis2.read(
reinterpret_cast<char*>(&d_2),
sizeof(double)
);
cout << setprecision(20) << d_2 << '\n';
fis2.close();

// ★6.
string x;
char* ptr = reinterpret_cast<char*>(&d_2);
for (
int i = 0;
i < sizeof(double) / sizeof(char);
i++)
x = bits_of(*(ptr + i)) + x;
cout << x << '\n';
}

h12_0051.png


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

お名前:

メールアドレス:


ホームページアドレス:

コメント:

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

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

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

 たまに、クリック お願いします 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日以上新しい記事の更新がないブログに表示されております。