ファイルを入力する Object Class を作成する



VC++ でファイルを入力する Object Class を作成して、メニューからテキストファイルを選択して表示します。
テンプレートを使う方法と、空のプロジェクトから作成する方法があるのですが、空から作成する方がわかり易いので こちらで説明します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの作成

  1. 空のプロジェクト(ObjInput)を作成して、次のファイルをフォルダーに格納して下さい。
    プログラムファイルは、この後の説明を参考にして各自で作成して下さい。
    [プロジェクト] [既存項目の追加] からヘッダファイルとプログラムファイルをプロジェクトに追加します。
    ファイル入力の詳細は TEXT ファイルを入力して画面に表示する を参照して下さい。
    ファイル名ファイルの説明
    Main.cpp Windows Main Program ファイル
    Datafile.h DATAFILE Object Class のヘッダファイル
    Datafile.cpp DATAFILE Object Class のソースファイル
    test.txt 入力するテストデータのファイル
  2. ページ先頭の画像を参考にして、メニューを作成してプロジェクトに追加して下さい。
    キャプションID
    ファイル(&F) IDR_MENU1(規定値)
    ファイル入力(&R) IDM_READ
    アプリケーションの終了(&X) IDM_EXIT
    ヘルプ(&H)
    バージョン情報(&A) IDM_ABOUT
  3. Main.cpp の説明です。
    DATAFILE Object Class と TEXT ファイルを入力する領域を定義します。
    DATAFILE *Datafile が Object Class の定義です。
    最初 buf[] には適当な文字列を格納しておいて下さい。
        #include    "Datafile.h"
        #include    "resource.h"
    
        DATAFILE    *Datafile= NULL;
        char        buf[1002]=
        { "Draw Text Sample Program\n000 11111111\n2222222\n33333333 444\n5555555555555\n" };
        
  4. WinMain() は何時もと同じでメニューを設定してウインドウを表示するだけです。
    MAKEINTRESOURCE(IDR_MENU1),NAME };
  5. WM_CREATE で DATAFILE Object Class を生成(インスタンス化)して、そのポインタを Datafile に格納します。
            case WM_CREATE:
                Datafile= new DATAFILE();
                break;
        
  6. WM_PAINT: に文字列を整形して表示するソースコードを記述します。
    GetClientRect() でウインドウのサイズを取得して DrawText() で表示します。
            case WM_PAINT:
                hdc= BeginPaint(hWnd,&ps);
                RECT rt;
                GetClientRect(hWnd,&rt);
                DrawText(hdc,buf,strlen(buf),&rt,DT_WORDBREAK);
                EndPaint(hWnd,&ps);
                break;
        
  7. IDM_READ: でテキストファイルを入力するソースコードを記述します。
    Datafile->ReadData() が Object Class で定義したメンバ関数の呼び出しです。
    TEXT 文字列をタイプしたファイル(test.txt) からデータを入力して buf に格納します。
    InvalidateRect(), UpdateWindow() でウインドウを再描画します。
            case WM_COMMAND:
                switch(LOWORD(wParam))
                {   case IDM_READ:
                        Datafile->ReadData("test.txt",buf,1000);
                        InvalidateRect(hWnd,NULL,TRUE);
                        UpdateWindow(hWnd);
                        break;
        
  8. IDM_ABOUT: と IDM_EXIT: がポストされたときは、何時もと同じように処理して下さい。
    IDM_ABOUT: では DialogBox を使っても MessageBox でもかまいません。
  9. WM_DESTROY: では終了する前に Object Class を開放して下さい。
            case WM_DESTROY:
                if (Datafile)
                {   delete(Datafile);
                    Datafile= NULL;
                }
                PostQuitMessage(0);
                return 0L;
        
  10. [デバッグ][デバッグなしで開始]を選択して、ビルドに続いて実行を行います。
    このプログラムは buf[] で定義した文字列を表示するだけなら Object Class を使う必要はありません。
    メニューから「ファイル入力」を選ぶと、メンバ関数 ReadData() が呼ばれて buf[] にデータが入力されます。
    "test.txt" に格納されている文字列が表示できれば完成です。

【ヒント】

  1. Object Class のヘッダファイル Datafile.h です。
    emsg[] はエラーメッセージを編集して MessageBox で表示するための領域です。
    オープンエラーを起こしたときなどに、エラーの詳細とファイル名を編集して表示して下さい。
    最初は ReadData() メンバ関数だけを作成して下さい。
        /*★ DATA File Object Header File  2002/12/11  前田 稔 ★*/
    
        class DATAFILE
        { protected:
            HANDLE  hFile;
            char    emsg[80];
    
          public:
            DWORD       dwBytes;            //入力(出力)長
            char        szFile[MAX_PATH];   //ファイル名(パス付き)
    
          public:
            DWORD       ReadData(LPSTR fname, char *buf, DWORD len);
        };
        
  2. Datafile.cpp はメインとは独立してコンパイルされます。
    このとき翻訳に必要なヘッダファイルを取り込んでおかなければなりません。
    意味不明の次のエラーが表示されたときはこれが原因です。
    ...\Datafile.cpp(23) : fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
    テンプレートを使って作成したときは stdafx.h を取り込んで下さい。
    #include "stdafx.h"
    空のプロジェクトから作成したときは windows.h と Object Class のヘッダファイルを取り込んで下さい。
        #include <windows.h>
        #include "datafile.h"
        
  3. stdafx.h を使うときは datafile.h は stdafx.h の中に取り込んで下さい。
    stdafx.h を使わないときは Datafile.cpp に windows.h と datafile.h を取り込んで下さい。

【演習】

Datafile.OpenReadData() でコモンダイアログから TEXT ファイル(*.TXT)を選択できるようにプログラムして下さい。
詳細は 入力ファイルを選択する を参照して下さい。

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

超初心者のプログラム入門(Win32API C++)