構造体のポインタ配列

構造体のポインタ配列を定義して、ファイルからデータを入力して格納します。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. ソースプログラムです。
    ファイル名 説明
    ArrayPtr.cpp 構造体のポインタ配列
  2. 構造体のポインタ配列を定義して、データをファイルから入力して格納します。
    成績レーコードの宣言とポインタ配列の定義です。
    ここで注意しなければならないことは *seiseki[100] は100個のポインタを定義しただけで、構造体の領域を定義した訳では無いことです。
    仮にポインタのサイズを4バイトとすると、構造体の大きさには関係なく 4*100=400 バイトの領域が割り当てられています。
    実際に構造体の領域を確保するのは new TSeiseki; で行います。
    // 成績レコードの定義
    typedef struct
    {   short   num;
        char    name[18];
        short   ten1;
        short   ten2;
        short   ten3;
    }   TSeiseki;
    
    TSeiseki    *seiseki[100];
    
  3. main() 関数です。
    read() 関数でデータをファイルから入力して、構造体に格納します。
    構造体の領域は new で割り当てて、そのアドレスをパラメータで渡されたポインタ配列に格納して行きます。
    read() 関数のリターン値 cnt はレコード(構造体)の件数です。
    次に割り当てた構造体の領域を print(seiseki,cnt); で表示します。
    最後に new で割り当てた構造体の領域を delete で開放します。
    //★ main 関数
    void main()
    {   int     cnt,i;
    
        cnt= read("Seiseki.txt",seiseki);
        print(seiseki,cnt);
        for(i=0; i<cnt; i++)    delete seiseki[i];
    }
    
  4. データをファイルから入力する read() 関数です。
    データファイルの名前と構造体のポインタ配列が渡されます。
    データファイルをオープンして、fread(buf,1,36,fi) で1レコード(36 バイト)ずつ入力します。
    入力長が 36 バイトより小さいときは、ファイルの終わり(End of File)です。
    構造体の領域を new で確保して、そのアドレスをポインタ配列に格納します。
    buf に入力した TEXT 形式のデータを編集して構造体のアイテムに格納します。
    ファイルが終了すると格納したレコード件数をリターンします。
    int read(char *fname, TSeiseki *p[])
    {   FILE    *fi;
        char    buf[40];
        int     i;
    
        if (!(fi= fopen(fname, "rb")))
        {   printf("file open error  file name=[%s]\n",fname);
            return 0;
        }
    
        for(i=0; fread(buf,1,36,fi)>=36; i++)
        {   p[i]= new TSeiseki;
            p[i]->num= atoi(buf);
            p[i]->ten1= atoi(buf+22);
            p[i]->ten2= atoi(buf+26);
            p[i]->ten3= atoi(buf+30);
            buf[20]= '\0';
            strcpy(p[i]->name,buf+4);
        }
        fclose(fi);
        return i;
    }
    
  5. 構造体のポインタ配列からデータを取得して表示する print(); 関数です。
    構造体のポインタ配列とレコードの件数が渡されます。
    void print(TSeiseki *p[], int cnt)
    {   int     i;
    
        for(i=0; i<cnt; i++)
        {   printf("\n%4d %-18s %3d %3d %3d",
                    p[i]->num,p[i]->name,p[i]->ten1,p[i]->ten2,p[i]->ten3);
        }
    }
    

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