/****************************************************************************** ファイルから配列にデータを読み込み、検索する ファイル名、キーはコマンドラインで指定する。ファイルは一行につきデータ一つで あり、文字列と数値の間はタブ(一つとは限らない)で区切られているとする。 ******************************************************************************/ #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); int Data_arraysearchstring(Data *p, int arraysize, char *s); int Data_stringcmp(Data *p, char *s); void Data_print(Data *p); int main(int argc, char *argv[]) { int i; FILE *in; if (argc != 3) { 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); /* 配列に読み込んで */ i = Data_arraysearchstring(a, arraysize, argv[2]); /* argv[2] を探す */ if (i == -1) { printf("見つかりません.\n"); } else { Data_print(a+i); } 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; } /* サイズ arraysize の Data 型の配列 p から string が s であるものを探し */ /* 添字(見つからなければ -1)を返す */ int Data_arraysearchstring(Data *p, int arraysize, char *s) { int i; for (i=0; istring, s); } /* Data 型オブジェクト *p を印字 */ void Data_print(Data *p) { printf("%s\t%d\n", p->string, p->number); }