Step 1. データファイルの読み出し、書き出し

ここでいうデータファイルとは数値データのアスキーファイルを想定します。データファイルの数値は整然とフォーマットされていることもありますし、そうでないこともあります。また、コメントなどが入っていることも多くあります。ここではまず、単純に x, y データのみが並んでいるものをまず扱い、複雑なケースは応用編で扱うことにします。
(簡単なケース)データファイルは以下のようなものとします。

4.0 120
4.2 130
4.4 150
4.6 120
4.8 100


1. スケルトンの作成

ベースとなる部分を作成します。(VC++を立ち上げ、「ファイル」新規作成でプロジェクト=Win AppWizardを選択し、プロジェクト名にstep1を入力し「次へ」、SDIを選択したあとはすべてデフォルトのまま進行させる。)ここでビルドするとなにもしないプログラムが作成されます。

2. ヘッダーファイルに変数(配列)宣言

画面左横にClass, Resource, File の札が下がったウインドウがあるのでFileをクリックする。ウインドウ内のstep1ファイルというところをクリックする。そうすると Source Files, Header Files, Resource Filesのディレクトリボックスが出てくる。ここでまずHeader Files をクリックする。変数の宣言はDocumentクラス、Viewクラスのいずれで宣言しても良いようです。ただし、どちらからも利用できるよう public で宣言しておきます。ここではViewのほうを使います。step1View.hをクリックするとメインウインドウにヘッダーファイルが表示されますので以下のように変数宣言します。


class CStep1View : public CView
{
protected: // シリアライズ機能のみから作成します。
    CStep1View();
    DECLARE_DYNCREATE(CStep1View)

// アトリビュート
public:
    CStep1Doc* GetDocument();

    //ここで変数宣言する
    double x[100], y[100];
        int    ndata;


3. ファイル入出力の主要部分

今度は画面左横のSource Filesのディレクトリボックスをクリックする。step1View.cppというファイルをクリックする。するとメインウインドウにViewクラスのソースが表示されます。

つぎに上のメニューバーの(すべてのクラスメンバ)とかかれているところをクリックし、ID_File_Openを選択します。その横の箱からCOMMANDを選択しクリックする(選択だけでなく必ずクリックする。)するとメンバ関数の追加というメッセージボックスが表示され関数名の入力画面になる。デフォルトはOnFileOpenとなっているのでこれでよければOKをクリックする。

問題のファイルからの入力ですが、ここではファイルストリームを使ってC++流でやってみます。 まず、ファイルストリームをつかうためにソースファイルの上のほうでfstream.hを読み込みます。


#include <fstream.h>


つぎにOnFileOpenのところを次のように書きます。

void CStep1View::OnFileOpen()
{
    // TODO: この位置にコマンド ハンドラ用のコードを追加してください
    CFileDialog filedlg(TRUE, "dat", "*.dat");

    CString filename;
    int nd;

    nd=0;

    if( filedlg.DoModal() == IDOK)
    {
                filename = filedlg.GetPathName();

                ifstream mystream(filename);

                while(!mystream.eof()) {
                        mystream >> x[nd] >> y[nd];
                        nd=nd+1;
                }

                ndata=nd-1;
        
                mystream.close();

    }

}


4. データファイルの保存

うえと同じような手順でID_FILE_SAVEのメッセージハンドラを用意します。以下のようにコード編集をする。


void CStep1View::OnFileSave()
{
    // TODO: この位置にコマンド ハンドラ用のコードを追加してください
    
    CFileDialog filedlg(FALSE, "dat", "*.dat");

    CString filename;

    if( filedlg.DoModal() == IDOK)
    {
                filename = filedlg.GetPathName();
                ofstream mystream(filename);

                for (int i=0; i < ndata; i++) {
                    mystream << x[i] << ' ' << y[i] << endl;
                }

                mystream.close();
    }

}


5. メニューの変更

メニューの変更は画面左横のウインドウのResourceの札をクリックします。step1リソースと表示がでますのでこれをクリックしいくつかフォルダが表示されますがこのうちのMenuをクリックします。IDR_MAINFRAMEというのをクリックするとメインウインドウにメニューが表示されますのでここで変更します。このへんの手順はたいていの参考書に必ず載っていますのでここではこれ以上詳しく書きません。


6. ファイルコンバーターの作成

上の手順でデータファイルの読み込みと書き出しができるようになりました。読み込んだ形式と異なる形式で書き出せば立派なファイルコンバーターの完成です。応用編ではX線データを2つの異なるファイル形式で保存するプログラムを作成します。