Up

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

 

 バイナリ・ファイル出力とテキスト・ファイル出力のファイル・サイズの比較を行うために以下のVisual C++/CLRプログラムを作成した。

 

// CheckBinaryFSize.cpp : メインプロジェクトファイルです。

 

#include "stdafx.h"

 

using namespace System;

using namespace System::IO;             //             StreamWriter, StreamReader, FileStream, BinaryWriter, BinaryReader

 

int main(array<System::String ^> ^args)

{

        //

        //              出力データの設定

        //

        const int n = 1000;

        double x[n];

        for (int i = 0; i < n; i++)

                x[i] = 1.0 / (i + 1.0);

 

        //

        //              テキストファイル出力

        //

        Console::Write("FileName1 = ");

        String ^ flnm1 = Console::ReadLine();

        StreamWriter ^ fout = gcnew StreamWriter( flnm1, false, System::Text::Encoding::GetEncoding("shift-jis") );

        for (int i = 0; i < n; i++)

                fout->WriteLine( x[i].ToString() );

        fout->Close();

 

        //

        //              バイナリファイル出力

        //

        Console::Write("File Name2 = ");

        String ^flnm2 = Console::ReadLine();

        FileStream ^ fs = gcnew FileStream( flnm2, FileMode::Create );

        BinaryWriter ^ bout = gcnew BinaryWriter( fs );

        for (int i = 0; i < n; i++)

                bout->Write(x[i]);

        bout->Close();

 

        //

        //              テキストファイル入力

        //

        double y1[n];

        StreamReader ^ fin = gcnew StreamReader( flnm1, System::Text::Encoding::GetEncoding("shift-jis") );

        for (int i = 0; i < n; i++)

                y1[i] = double::Parse(fin->ReadLine());

        fin->Close();

        for (int i = 0; i < n; i++)

                if ((i < 20) || (i > 980))

                        Console::WriteLine(i.ToString() + ":  " + y1[i].ToString());

 

        //

        //              バイナリファイル入力

        //

        double y2[n];

        fs = gcnew FileStream( flnm2, FileMode::Open );

        BinaryReader ^ bin = gcnew BinaryReader( fs );

        for (int i = 0; i < n; i++)

                y2[i] = bin->ReadDouble( );

        bin->Close();

        for (int i = 0; i < n; i++)

                if ((i < 20) || (i > 980))

                        Console::WriteLine(i.ToString() + ":  " + y2[i].ToString());

                       

        Console::WriteLine("Press down Enter key to quit.");

        Console::ReadLine();

        return 0;

}

 

バイナリ・ファイル入出力についてはウェブサイト<バイナリ・ファイル入出力>で、テキスト・ファイル入出力については<岡本安晴「大学生のための心理学VC++プログラミング入門」勁草書房pp. 200-203>で説明している。

上のプログラムを実行したときのコンソール画面の出力を以下に示す。

===================================

FileName1 = f1

File Name2 = f2

0:  1

1:  0.5

2:  0.333333333333333

3:  0.25

4:  0.2

5:  0.166666666666667

6:  0.142857142857143

7:  0.125

8:  0.111111111111111

9:  0.1

10:  0.0909090909090909

11:  0.0833333333333333

12:  0.0769230769230769

13:  0.0714285714285714

14:  0.0666666666666667

15:  0.0625

16:  0.0588235294117647

17:  0.0555555555555556

18:  0.0526315789473684

19:  0.05

981:  0.0010183299389002

982:  0.00101729399796541

983:  0.00101626016260163

984:  0.00101522842639594

985:  0.00101419878296146

986:  0.00101317122593718

987:  0.00101214574898785

988:  0.00101112234580384

989:  0.00101010101010101

990:  0.00100908173562059

991:  0.00100806451612903

992:  0.00100704934541793

993:  0.00100603621730382

994:  0.00100502512562814

995:  0.00100401606425703

996:  0.00100300902708124

997:  0.00100200400801603

998:  0.001001001001001

999:  0.001

0:  1

1:  0.5

2:  0.333333333333333

3:  0.25

4:  0.2

5:  0.166666666666667

6:  0.142857142857143

7:  0.125

8:  0.111111111111111

9:  0.1

10:  0.0909090909090909

11:  0.0833333333333333

12:  0.0769230769230769

13:  0.0714285714285714

14:  0.0666666666666667

15:  0.0625

16:  0.0588235294117647

17:  0.0555555555555556

18:  0.0526315789473684

19:  0.05

981:  0.0010183299389002

982:  0.00101729399796541

983:  0.00101626016260163

984:  0.00101522842639594

985:  0.00101419878296146

986:  0.00101317122593718

987:  0.00101214574898785

988:  0.00101112234580384

989:  0.00101010101010101

990:  0.00100908173562059

991:  0.00100806451612903

992:  0.00100704934541793

993:  0.00100603621730382

994:  0.00100502512562814

995:  0.00100401606425703

996:  0.00100300902708124

997:  0.00100200400801603

998:  0.001001001001001

999:  0.001

Press down Enter key to quit.

=============================

上のプログラムの実行で作成されたテキストファイルf1およびバイナリファイルf2のサイズは図1に示す通りである。

図1

 

バイナリ・ファイルf2の方が小さいことがわかる。

プログラム・ソース・ファイルなどをまとめた圧縮ファイルCheckBinaryFSize.zipはファイル名CheckBinaryFSize.zipをクリックしてダウンロードすることができる。ダウンロードした圧縮ファイルはマウスの右ボタンでクリックして表示されるメニュから「解凍」あるいは「展開」を選んで解凍することができる。解凍したプログラムはVisual C++2008で開いて、実行する事が出来る。

 

 

Up