#include <stdio.h>
#include <string.h>
#define MAX_RECORD_LENGTH 10
#define LINE_BUFFER 256
#define TRUE 1
#define FALSE 0
typedef struct {
char id[10];
char name[20];
char organization[20];
char position[20];
} record_t;
int parse_record(const char *line, record_t *record) {
char str[strlen(line)], *tp;
record_t _record;
strcpy(str, line);
tp = strtok(str, ",");
if(!tp || strlen(tp)>10) return FALSE;
strcpy(_record.id, tp);
tp = strtok(NULL, ",");
if(!tp || strlen(tp)>20) return FALSE;
strcpy(_record.name, tp);
tp = strtok(NULL, ",");
if(!tp || strlen(tp)>20) return FALSE;
strcpy(_record.organization, tp);
tp = strtok(NULL, ",\n");
if(!tp || strlen(tp)>20) return FALSE;
strcpy(_record.position, tp);
if(strtok(NULL, ",")) return FALSE; // 役職列以降にデータが有ればエラー
memcpy(record, &_record, sizeof(record_t));
return TRUE;
}
int check_unique(const record_t new_record, const record_t *record_array, const size_t len) {
for(int i=0; i<len; i++) {
if(strcmp(new_record.id, record_array[i].id) == 0) return FALSE;
}
return TRUE;
}
int main() {
FILE *fp;
record_t record_array[MAX_RECORD_LENGTH];
size_t count = 0;
char line[LINE_BUFFER];
printf("ファイルオープン\n");
fp = fopen("./record.txt", "r");
if(fp == NULL) {
printf("Error : file\n");
return -1;
}
printf("--- ファイル読み込み開始 ---\n");
while(fgets(line, LINE_BUFFER, fp) != NULL) {
if(count > MAX_RECORD_LENGTH) {
printf("Error : count\n");
continue;
}
record_t record;
if(!parse_record(line, &record)) {
printf("Error : parse\n");
continue;
}
if(!check_unique(record, record_array, count)) {
printf("Error : unique\n");
continue;
}
memcpy(&(record_array[count]), &record, sizeof(record_t));
++count;
}
printf("--- ファイル読み込み終了 ---\n");
printf("Total count : %zu\n", count);
for(int i=0; i<count; i++) {
printf("count:%d, id:%s, name:%s, organization:%s, position:%s\n",
i, record_array[i].id, record_array[i].name, record_array[i].organization, record_array[i].position);
}
}