構造体の配列を宣言して、ファイルからデータを読み込むサンプルプログラムです。
今回は入力までです。配列を関数へ渡して利用する例は次回に。
#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 n[10]; //int型が10個分の配列
shape_t stars[10]; //shape_t型が10個分の配列
fscanf( fp, "%s %f %f\n", stars[i].name, &stars[i].height, &stars[i].weight )
[ 関連記事 ] 宣言:構造体宣言,
構造体タグ名
構造体配列:関数操作, ソート, ポインタソート
構造体へのポインタ,
リスト構造,
構造体を関数の戻り値に
[ ご案内 ] 構造体の要点を学習できるコース:要点講座 [ 構造体編 ]
char fmt[8]; sprintf( fmt, "%%%ds", DIGITS ); //DIGITS桁の変換書式を文字列fmtに設定 scanf( fmt, num ); //<-- scanf("%4s", num);