アプリ版:「スタンプのみでお礼する」機能のリリースについて

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);
}

A 回答 (3件)

まず、取得データをファイルに書き込むのではなく、内部に格納バッファを用意してそこに一時バッファとして格納してください。


CSV仕様上、改行('\n')が要素の終端を表しますので、まず、CSVファイルから1行づつバッファに読み込み、そのバッファデータからカンマ検索実施の上各構造体メンバにセットすればよいと思います。
    • good
    • 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;
}
    • good
    • 0

 fclose 忘れてた。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!