Text Class を作成-2

Text Object Class に数値を切り出すメンバー関数を追加します。

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

プロジェクトの設定

  1. 前回作成した Text Class を作成-1 の続きです。
    ゲームを制御するデータなどを TEXT FILE にタイプして、プログラムで読み込むことが良くあります。
    そこで Text Object Class に数値を切り出すメンバー関数を追加して、テーブルに格納してみましょう。
  2. Text Class のヘッダファイル TextClass.h です。
    public: メンバー関数として次の関数を追加して下さい。
      public:
               :
        char*           NextItem(char *buf);
        char*           NextP(char *buf);
        char*           SetInt(int tbl[], char *buf, int n);
        char*           SetFloat(float tbl[], char *buf, int n);
    
  3. Text Class のプログラムファイル TextClass.cpp です。
    ヘッダファイルで定義したメンバー関数を作成します。
    NextItem() は変換が終わったアイテムの次にポインタを設定する関数です。
    TEXT 形式でタイプするデータはカンマ(,) または Enter コードで区切ります。
    NextItem() では *buf の位置から、カンマ(,) または Enter コードを探し出し、その次の位置をリターンします。
    領域外をポイントしないように buf 領域の最後には '\0' を格納しておいて下さい。
    // 次の item(, か \n の次) にポイントする
    char*  TextClass::NextItem(char *buf)
    {   char    *p;
        for(p=buf; *p && *p!=',' && *p!='\n'; p++);
        p++;
        return  p;
    }
    
  4. NextP() は次のアイテムの先頭にポインタを設定する関数です。
    TEXT 形式でタイプするアイテムは +, - または数字から始まります。
    NextP() では *buf の位置から、+, - または数字を探し出してその位置をリターンします。
    NextItem() と組み合わせて使うと改行コードやコメントなどをスキップすることが出来ます。
    // item の先頭「- + 数字」をポイントする
    char*  TextClass::NextP(char *buf)
    {   char    *p;
        for(p=buf; *p!='-' && *p!='+' && (*p<'0'||*p>'9'); p++);
        return  p;
    }
    
  5. SetInt() は int 型のテーブルにデータを格納する関数です。
    tbl[] は変換したデータを格納する領域で、n が格納する件数です。
    *buf の位置から検索を始めて n 件のデータを格納するまでポインタを進めます。
    // TEXT データを BIN に変換する
    char*  TextClass::SetInt(int tbl[], char *buf, int n)
    {   char    *p;
        int     cnt;
    
        cnt= 0;
        p= buf;
        while(cnt<n)
        {   p= NextP(p);
            tbl[cnt]= atoi(p);
            cnt++;
            p= NextItem(p);
        }
        return(p);
    }
    
  6. SetFloat() は float 型のテーブルにデータを格納する関数です。
    tbl[] は変換したデータを格納する領域で、n が格納する件数です。
    *buf の位置から検索を始めて n 件のデータを格納するまでポインタを進めます。
    // TEXT データを FLOAT に変換する
    char*  TextClass::SetFloat(float tbl[], char *buf, int n)
    {   char    *p;
        int     cnt;
    
        cnt= 0;
        p= buf;
        while(cnt<n)
        {   p= NextP(p);
            tbl[cnt]= (float)atof(p);
            cnt++;
            p= NextItem(p);
        }
        return(p);
    }
    
  7. 入力する TEXT FILE の例です。
    最初に20件の int 型データを、続いて10件の float 型のデータをタイプしてみました。
        111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
        99, 98, 97, 96, 95,  5, 4, 3, 2, 1,
        12.1, 12.2, 12.3, 12.4, 12.5
        3.14, 3.15, 3.16, 3.17, 3.18,
        
  8. テータを格納する配列の定義です。
    TEXT FILE を入力して、20件の int 型データと10件の float 型のデータを格納する main() 関数を作成して下さい。
        int     T_int[50];
        float   T_float[20];
        
  9. C# を使った簡単な変換方法は「超初心者のプログラム入門(C#)/数字の列を配列に変換」を参照して下さい。
    数字の列を配列に変換
    本格的な TEXT DATA の形式は C言語 Windows から シップの動きを Text File で制御する

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