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);
}
補足
バッファリングだったかもしれません。 本に載っていたことなんですが、どの本だったか忘れてしまいました。 たしか open() for(;;){ read(1) rwite() > stdout } cose() と fopen() for(;;){ fgetc() putc() } fclose のような2つの実行ファイルを作って実行させて、実行された時の様子をstraceしてみたら、前者はreadが数回だったのに後者はreadが1回だったという内容でした。 僕の考えが大筋正解なら、後者はfor()で1バイトずつバッファリングデータからの読み込みをしているということですか?