■csvを解析する正規表現の使い方
#include <stdio.h>
#include <stdlib.h>
//構造体の宣言
typedef struct 個人情報 {
char 住所[1024];
char 氏名[1024];
int 年齢;
} 個人情報 ;
//構造体配列の定義
static 個人情報 一覧[10];
//構造体ポインタを使った構造体のメンバ表示
static void 個人情報表示(個人情報 *p)
{
printf("■%s\n",p->住所);
printf("%s\n",p->氏名);
printf("%d\n",p->年齢);
}
static void 全個人情報表示(void)
{
for(個人情報 *p = &一覧[0]; p->氏名[0] != '\0' ;p++){
個人情報表示(p);
}
}
static void 全個人情報設定(FILE *fp)
{
個人情報 *p = &一覧[0];
char buf[BUFSIZ];
const int max = sizeof(一覧)/sizeof(一覧[0]);
while(fgets(buf,BUFSIZ,fp) != NULL){
//空行はスキップ
if(buf[0] == '\n'){
continue;
}
//入力データが多すぎないか確認
int id = p - &一覧[0];
if(id >= max){
fprintf(stderr,"最大値 %d 件を超えました\n",max);
exit(1);
}
//【住所,氏名,年齢】3フィールド読み込む
int ret = sscanf(buf,
"%[^,],%[^,],%d",//正規表現【カンマ以外,カンマ以外,数字】
p->住所,
p->氏名,
&(p->年齢)
);
if(ret != 3){//3フィールド読めなかったら無視
fprintf(stderr,"入力異常 ret=%d:%s",ret,buf);
continue ;
}
p++ ;
}
}
int main(void)
{
char *input = "input.csv";
FILE *fp = fopen(input,"r");
if(fp == NULL){
fprintf(stderr,"%s 開かん\n",input);
exit(1);
}
全個人情報設定(fp);
全個人情報表示();
fclose(fp);
}
コピペしてコンパイル&実行して動作を確認してください。
■input.csvの例
愛知,山田太郎,4
岐阜,佐藤次郎,5
三重,鈴木三郎,6