/****************************************************************************** ファイルから配列にデータを読み込む ファイル名はコマンドラインで指定する。ファイルは一行につきデータ一つであり、 文字列と数値の間はタブ(一つとは限らない)で区切られているとする。 ******************************************************************************/ #include #include #include #define OK 1 #define YES 1 #define NO 0 struct data { /* Data 型を定義 */ char *string; /* 文字列データ */ int number; /* 数値データ */ }; typedef struct data Data; /* struct data を Data と呼ぶ */ #define N 20 /* 配列の大きさ */ #define BUFSIZE 1024 /* バッファの大きさ */ Data a[N]; /* Data 型の配列 */ int arraysize; /* 配列に実際に保持されているデータ数 */ int Data_read(Data *p, FILE *in); int Data_read2array(Data *p, FILE *in, int size); void Data_printarray(Data *p, int size); void Data_print(Data *p); int main(int argc, char *argv[]) { FILE *in; if (argc != 2) { fprintf(stderr, "引数の数が違います.\n"); return 1; } in = fopen(argv[1], "rt"); if (in == NULL) { fprintf(stderr, "ファイル \"%s\" を開けません.\n", argv[1]); return 1; } arraysize = Data_read2array(a, in, N); /* 配列に読み込んで */ Data_printarray(a, arraysize); /* それを印字 */ return 0; } /* in から配列 p に最大 size 個読み込み、読めた個数を返す */ int Data_read2array(Data *p, FILE *in, int size) { int i; for (i=0; istring = malloc(j+1); /* メモリを要求 */ if (p->string == NULL) { fprintf(stderr, "メモリが足りません.\n"); return NO; } buf[j] = '\0'; strcpy(p->string, buf); /* 文字列をコピー */ while (buf[++j] == '\t') { /* タブをスキップ */ ; } p->number = atoi(buf+j); /* 数値データを読み込む */ return OK; } /* Data の配列 p[0], ..., p[size-1] を印字 */ void Data_printarray(Data *p, int size) { int i; for (i=0; istring, p->number); }