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';
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7521648
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック