• ベストアンサー

csvファイルのデータを構造体に

csvファイルのカンマを数えて任意の文字列を抜き出すまでは出来たのですがそこから構造体に格納するまでがこちらのサイトでも検索しましたがよくわかりません。 ご指摘のほどよろしくお願いします。 csvデータ 番号,名前,住所,電話,年齢,性別 1,佐藤,東京,1234,33,A 2,田中,,5678,22, 3,坂井,名古屋,,,B ・ ・ 番号,住所,電話,年齢を格納する場合 struct k_data { char no[4];/* 出来れば番号を右詰めにしたい */ char add[20]; int tel; int age; } kaiin[256]; /* 文字列を抜き出す↓ */ int main(void) { FILE *fp1,*fp2; char dat[256]; char *ch; int cnt; /* fp1 ファイルオープン */ /* fp2 ファイルクローズ */ while (fgets(dat, 256, fp1) != NULL) { cnt = 0; for (ch = dat; *ch != '\0'; ch++) { if (*ch ==',') { if (cnt == 0) { putc(*ch, fp2); } if (cnt == 2) { putc(*ch, fp2); } if (cnt == 3) { putc(*ch, fp2); } if (cnt == 4) { putc('\n', fp2); } cnt++; } else { if (cnt == 0) { putc(*ch, fp2); } if (cnt == 2) { putc(*ch, fp2); } if (cnt == 3) { putc(*ch, fp2); } if (cnt == 4) { putc(*ch, fp2); } } } putc('\0', fp2); } fclose(fp2); fclose(fp1); }

質問者が選んだベストアンサー

  • ベストアンサー
  • tanma3
  • ベストアンサー率58% (14/24)
回答No.1

まず、取得データをファイルに書き込むのではなく、内部に格納バッファを用意してそこに一時バッファとして格納してください。 CSV仕様上、改行('\n')が要素の終端を表しますので、まず、CSVファイルから1行づつバッファに読み込み、そのバッファデータからカンマ検索実施の上各構造体メンバにセットすればよいと思います。

その他の回答 (2)

回答No.3

 fclose 忘れてた。

回答No.2

#include <stdio.h> #include <stdlib.h> struct k_data{ char no[4]; char add[20]; int tel; int age; }; int main(void) { FILE *fp = fopen("data.txt", "r"); struct k_data kaiin[256]; char tels[16], ages[16]; int i; if(!fp) return 1; for(i = 0; i < 256 ; i ++){ kaiin[i].no[0] = kaiin[i].add[0] = tels[0] = ages[0] = '\0'; if(fscanf(fp, "%[^,]%*c%*[^,]%*c%[^,]%*c%[^,]%*c%[^,]%*c%*[^\n] ", kaiin[i].no, kaiin[i].add, tels, ages) == EOF) break; kaiin[i].tel = strtol(tels, NULL, 10); kaiin[i].age = strtol(ages, NULL, 10); printf("(%4s)(%20s)(%8d)(%8d)\n", kaiin[i].no, kaiin[i].add, kaiin[i].tel, kaiin[i].age); } return 0; }