Thinkers'Studio
JavaとC言語の自習ツール
構造体配列にデータを読み込むには

 構造体の配列を宣言して、ファイルからデータを読み込むサンプルプログラムです。
 今回は入力までです。配列を関数へ渡して利用する例は次回に。

構造体配列にファイルからデータ入力するプログラム例 】
#include <stdio.h>
#include <stdlib.h>
#define MAXCNT 10

typedef struct {        // 構造体の宣言
    char name[16];
    float height;
    float weight;
} shape_t;

main()
{
    int i, mt;
    FILE *fp;
    shape_t stars[MAXCNT];  // 構造体配列の宣言

    if( (fp = fopen( "starsdata.txt", "r" )) == NULL ) {
        printf( "ファイルがオープンできません\n" );
        exit( 1 );
    }
    for( i = 0; i < MAXCNT; i++ ) {
        if( fscanf( fp, "%s %f %f\n"      // 構造体配列への読み込み
        , stars[i].name, &stars[i].height, &stars[i].weight ) != 3 ) break;
    }
    fclose( fp );

    // 本来なら、入力したデータを関数などに渡して使います
    // たとえば一番背の高い人を調べる関数
    // int whoIsTallest( shape_t stars[], int num ) など
    // 関数との受け渡しは次回のTipsで ...

    mt = 3;  // ここでは3が返されたことにします
    printf( "The tallest is %s(%.1fcm)\n", stars[mt].name, stars[mt].height );
}
データファイル starsdata.txt を下記とすると
Brad_Pitt 183.2 73.4
Tom_Cruise 170.1 67.2
Johnny_Depp 178.2 70.5
Will_Smith 188.0 78.3
Bruce_Willis 184.0 78.3
実行結果は
The tallest is Will_Smith(188.0cm)

 ファイルの書式に合わせて fscanf に変換書式を指定し、構造体配列 stars[i] に 1セットずつデータを読み込みます。
 ここでは、配列サイズ-1 (i < MAXCNT) の間入力を繰り返します。 fscanf の戻り値を調べ、ファイルの終わりや読み込みエラーで break しています。

構造体配列の宣言のしかた

 構造体は『自分で定義するデータ構造』です。他のデータ型の配列宣言で、たとえば int などと書くところが、定義した「データ型名」または「構造体タグ名」になるだけです。
  (データ型)  (配列名[サイズ])
    int      n[10];      //int型が10個分の配列
    shape_t  stars[10];  //shape_t型が10個分の配列

構造体配列に値を入れる

  1. 構造体配列 stars の i番目の要素は、stars[i]
  2. stars[i] のメンバを参照するには、メンバ参照演算子 . をつけて、stars[i].name, stars[i].height, stars[i].weight
  3. fscanf でそれらに入力するには、引数にポインタを渡す
    stars[i].name は配列なので、そのままでその先頭アドレスのことになります。それ以外はアドレス演算子 & をつけます。
      fscanf( fp, "%s %f %f\n", stars[i].name, &stars[i].height, &stars[i].weight )
    
(今回のクイズです)
 プログラム内で初期化によって構造体配列にデータを指定する場合、どのように書けばよいでしょうか?
   (答えは、次回のC言語の Tips で ・・・)

[ 関連記事 ] 宣言:構造体宣言, 構造体タグ名  構造体配列:関数操作, ソート, ポインタソート
        構造体へのポインタ, リスト構造, 構造体を関数の戻り値に
[ ご案内 ] 構造体の要点を学習できるコース:要点講座 [ 構造体編 ]

前回のクイズの答え: (前回の問題を見る
クイズ1  関数HighOrLow を含むプログラムは   >> ヒントを追加したり scanf を改善したプログラム
クイズ2  下記のようにします。% を出力するには %% と書きます。 この修正も上記リンクで表示されます。
  char fmt[8];
  sprintf( fmt, "%%%ds", DIGITS );   //DIGITS桁の変換書式を文字列fmtに設定
  scanf( fmt, num );                 //<-- scanf("%4s", num);