レコード番号入力で、不正な番号を入力した場合 (0やマイナスの整数もしくは存在しないレコード番号) は繰り返し、番号入力を要求します。#include <stdio.h> #include <process.h> #define TOTAL_SIZE 70 int main(void) { int no, max_no; char name[20], address[30], birth[20]; char f_name[20], yes_no[16]; long length; FILE *fp; printf("ファイル名="); scanf("%s", f_name); fp = fopen(f_name, "r"); if (fp == NULL) { printf("エラーです"); exit(-1); } fscanf(fp, "%d", &max_no); while(1) { while(1) { printf("[No.]="); scanf("%d", &no); if (no >= max_no || no <= 0) printf("番号入力エラーです\n"); else break; } length = TOTAL_SIZE * (no - 1); fseek(fp, length + 5L, 0); fscanf(fp, "%20s %30s %20s", name, address, birth); printf("名前=%s\n", name); printf("住所=%s\n", address); printf("誕生日=%s\n\n", birth); printf("続けますか(Y/N)"); scanf("%s", yes_no); if (strcmp(yes_no, "N") == 0) break; } return 0; }
その後読み出しはレコード番号を元に
何バイト目から読み出せばよいかを計算します。
あとはfseekを使って読み出せばいいですね。
読み出しが終わったら、もう一度読み出しを行うか
どうかを聞きます。「N」なら終了です。
while(1)が2重に使われていることに注意してください。
それでは実行してみましょう。
まあ、何とか正しく動きますね。
レコード番号だけでなく、名前や住所で
検索できるようにプログラムを改良してみてください。
Update Dec/19/1996 By Y.Kumei