fscanf()関数でcsvファイルを読み込む

/* hash関数 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define NHASH 30
#define MULTIPLER 31
#define CREATE 1

typedef struct Nameval Nameval;
struct Nameval {
	char *name;
	int value;
	Nameval *next;		/* チェイン中の次 */
};

Nameval *symtab[NHASH];	/* シンボルテーブル */

/* hash: 文字列のハッシュ値を計算 */
unsigned int hash(char *str)
{
	unsigned int h;
	unsigned char *p;

	h = 0;
	for (p = (unsigned char *) str; *p != '\0'; p++)
		h = MULTIPLER * h + *p;
	return h % NHASH;
}

/* lookup: symtab中で名前を検索し、オプションによって項目を生成 */
Nameval* lookup(char *name, int create, int value)
{
	int h;
	Nameval *sym;
	char *n_name;

	h = hash(name);
	for (sym = symtab[h]; sym != NULL; sym = sym->next)
		if (strcmp(name, sym->name) == 0)
			return sym;
	if (create) {
		sym = (Nameval *) malloc(sizeof(Nameval));
		if (sym == NULL) {
			printf("メモリを確保できませんでした。\n");
			exit(1);
		}
		n_name = malloc(strlen(name)+1);
		if (n_name == NULL) {
			printf("メモリを確保できませんでした。\n");
			exit(1);
		}
		memcpy(n_name, name, strlen(name)+1);

		sym->name = n_name;
		sym->value = value;
		sym->next = symtab[h];
		symtab[h] = sym;
	}
	return sym;
}


int main()
{
	char name[80];
	int value, i;
	Nameval* pnv;
	FILE *fp;

	if ((fp = fopen("file.csv", "r")) == NULL) exit(1);

	while (fscanf(fp, "%[^,],%d\n", name, &value) != EOF) { 
        /* %[^,] がカンマ,を除いて読み込む指定となる*/
		lookup(name, CREATE, value);
	}
	fclose(fp);

	for (i = 0; i < NHASH; i++) {
		printf("table[%d],", i);
		for (pnv = symtab[i]; pnv != NULL; pnv = pnv->next)
			printf("%s_%d,", pnv->name, pnv->value);
		printf("NULL\n");
	}

	return 0;
}