Up

バイナリファイル出力とテキストファイル出力の比較

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に示す。

Screenshot-3.png

図1

 

バイナリファイルの方がサイズが小さいことがわかる。バイナリ・ファイルでは数値のメモリ上での内部表現がそのままファイルに書き出されているのでdouble型のデータ1個当たり8バイトの大きさである。テキストファイル出力では数値が何個の文字で表されているかに依存してサイズが決まる。プログラムのソースファイルCheckBinaryFileVCpp2008.cppは、ファイル名CheckBinaryFileVCpp2008.cppをマウスの右ボタンでクリックしてダウンロードできる。

 なお、上のプログラムはVisdual C++2008/Windows Vista,Windows7で実行すると(VC++に合わせた変更は行うが)、バイナリ・ファイル出力がうまくいかないので注意(2011.1.4現在)。

 

Up