バイナリファイル出力とテキストファイル出力の比較
C++/Linux(Ubuntu10)
バイナリファイル出力とテキストファイル出力の場合の出力ファイルのサイズの比較を行うプログラムを以下のように作成してみた
#include <iostream> // C++標準入出力cinおよびcout用
#include <fstream> // ofstream,ifstream用
using namespace std;
int main()
{
const int n = 1000;
double x[n];
for (int i = 0; i < n; i++)
x[i] = 1.0 / (i + 1.0);
//
// テキストファイル出力
//
char flnm1[100];
cout << "File Name1 = ";
cin >> flnm1;
ofstream fout;
fout.open(flnm1);
for (int i = 0; i < n; i++)
fout << x[i] << endl;
fout.close();
//
// バイナリファイル出力
//
cout << "File Name2 = ";
char flnm2[100];
cin >> flnm2;
FILE *pfout;
pfout = fopen(flnm2, "w");
fwrite(x, 8*n, 1, pfout);
fclose(pfout);
//
// テキストファイル入力
//
ifstream fin;
fin.open(flnm1);
double y1[n];
for (int i = 0; i < n; i++)
fin >> y1[i];
fin.close();
for (int i = 0; i < n; i++)
if ((i < 20) || (i > 980))
cout << i << ": " << y1[i] << endl;
//
// バイナリファイル入力
//
FILE *pfin;
pfin = fopen(flnm2, "r");
double y2[n];
fread(y2, 8*n, 1, pfin);
fclose(pfin);
cout << endl;
for (int i = 0; i < n; i++)
if ((i < 20) || (i > 980))
cout << i << ": " << y2[i] << endl;
return 0;
}
バイナリ・ファイル入出力の説明は別のウェブサイト<バイナリ・ファイル入出力>で、テキストファイル入出力の説明は<テキストファイル入出力>で行っている。
上のプログラムを実行したときの端末(コンソール)画面への出力例を以下に示す。
====================================
yasuharu@yasuharu-VirtualBox:~/WorkSpace/checkBFileSize$ g++ -o CheckBinaryFileVCpp2008 CheckBinaryFileVCpp2008.cpp
yasuharu@yasuharu-VirtualBox:~/WorkSpace/checkBFileSize$ ./CheckBinaryFileVCpp2008
File Name1 = f1
File Name2 = f2
0: 1
1: 0.5
2: 0.333333
3: 0.25
4: 0.2
5: 0.166667
6: 0.142857
7: 0.125
8: 0.111111
9: 0.1
10: 0.0909091
11: 0.0833333
12: 0.0769231
13: 0.0714286
14: 0.0666667
15: 0.0625
16: 0.0588235
17: 0.0555556
18: 0.0526316
19: 0.05
981: 0.00101833
982: 0.00101729
983: 0.00101626
984: 0.00101523
985: 0.0010142
986: 0.00101317
987: 0.00101215
988: 0.00101112
989: 0.0010101
990: 0.00100908
991: 0.00100806
992: 0.00100705
993: 0.00100604
994: 0.00100503
995: 0.00100402
996: 0.00100301
997: 0.001002
998: 0.001001
999: 0.001
0: 1
1: 0.5
2: 0.333333
3: 0.25
4: 0.2
5: 0.166667
6: 0.142857
7: 0.125
8: 0.111111
9: 0.1
10: 0.0909091
11: 0.0833333
12: 0.0769231
13: 0.0714286
14: 0.0666667
15: 0.0625
16: 0.0588235
17: 0.0555556
18: 0.0526316
19: 0.05
981: 0.00101833
982: 0.00101729
983: 0.00101626
984: 0.00101523
985: 0.0010142
986: 0.00101317
987: 0.00101215
988: 0.00101112
989: 0.0010101
990: 0.00100908
991: 0.00100806
992: 0.00100705
993: 0.00100604
994: 0.00100503
995: 0.00100402
996: 0.00100301
997: 0.001002
998: 0.001001
999: 0.001
yasuharu@yasuharu-VirtualBox:~/WorkSpace/checkBFileSize$
====================================
上の実行例において作成されたテキストファイルf1およびバイナリファイルf2のサイズを図1に示す。
図1
バイナリファイルの方がサイズが小さいことがわかる。バイナリ・ファイルでは数値のメモリ上での内部表現がそのままファイルに書き出されているのでdouble型のデータ1個当たり8バイトの大きさである。テキストファイル出力では数値が何個の文字で表されているかに依存してサイズが決まる。プログラムのソースファイルCheckBinaryFileVCpp2008.cppは、ファイル名CheckBinaryFileVCpp2008.cppをマウスの右ボタンでクリックしてダウンロードできる。
なお、上のプログラムはVisdual C++2008/Windows Vista,Windows7で実行すると(VC++に合わせた変更は行うが)、バイナリ・ファイル出力がうまくいかないので注意(2011.1.4現在)。