構造体ポインタにファイルを読み込みたい
読み込みたいcsvファイル
"ID","名前", "住所", "誕生日" ,"電話番号"
"1","aaa","bbb","111","222"
コードが長いですが、ユーザーに値を入力してもらい表示するプログラムです。
リスト構造になっています。
csvファイルから読み込みという選択肢を増やしたいですが、自力で実装できず。
main関数の次の関数のread__person関数の中を変更したいです。構造体ポインタにcsvファイルを読み込みたいです。fscanfをつかって読み込もうとしているのですが、文字化けしてしまい、原因がわからず。
typedef struct student { char id; char name[NAME_LEM_MAX + 1]; char address[ADDRESS_LEM_MAX + 1]; char birth[BIRTH_LEM_MAX + 1]; char phone_number[NUMBER_LEM_MAX + 1]; struct student *next; // 次のデータがある場所 } PERSON_t; static PERSON_t *head = NULL; // リストの先頭 ノードが存在するアドレス static PERSON_t *tail = NULL; // リストの末尾 int add_person(int id); int delete_person(void); int change_person(void); int save_person(void); int read_person(void); void person_result(void); void get_string(char *str, unsigned int num); int get_person_id(PERSON_t *p); int get_person_name(PERSON_t *p); int get_person_address(PERSON_t *p); int get_person_birth(PERSON_t *p); int get_person_phone_number(PERSON_t *p); int main(void) { int number = 0; int id = 0; int ret; int end_flag = 0; enum select; PERSON_t *current, *data; FILE *fp; while(end_flag == 0) { printf("---------------------------------------------\n"); printf("1.一覧\n2.一件表示\n3.追加入力\n4.変更\n5.削除\n11.保存\n12.読み込み\n0.終了\n "); scanf("%d",&number); fflush(stdin); switch(number){ case 1: person_result(); break; case 2: person_result(); break; case 3: id++; ret = add_person(id); if(ret == NO_PROBLEM){ puts("追加完了"); } break; case 4: ret = change_person(); if(ret == NO_PROBLEM){ puts("変更完了"); } break; case 5: ret = delete_person(); if(ret == NO_PROBLEM){ puts("削除完了"); } break; case 11: puts("保存"); puts("-------------\n"); ret = save_person(); if(ret == NO_PROBLEM){ puts("保存完了"); } break; case 12: puts("読み込み"); puts("-------------\n"); ret = read_person(); if(ret == NO_PROBLEM){ puts("読み込み完了"); } break; case 0: puts("終"); end_flag = 1; break; default: //何もしない break; } } return 0; } int read_person(void) { int ret = NO_PROBLEM; PERSON_t *data; FILE *fp; //file型構造体 free(data); fp = fopen("test.csv", "r"); //読み込みモードファイルをで開く if( fp == NULL ){ perror("失敗\n"); return ERROR; }else{ puts("成功\n"); } data = (PERSON_t *)malloc(sizeof(PERSON_t)); fscanf(fp, "%d%s%s%s%s", &data->id, data->name, data->address, data->birth, data->phone_number) ; printf(" %d\n %s\n %s\n %s\n %s\n",&data->id, data->name, data->address, data->birth, data->phone_number); return ret; } ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー int save_person(void) { PERSON_t *current; FILE *fp; int ret = NO_PROBLEM; fp = fopen("test.csv", "w"); if( fp == NULL ){ perror("失敗\n"); return ERROR; }else{ puts("成功\n"); } fprintf(fp, " \"ID\" \"名前\" \"住所\" \"誕生日\" \"電話番号\" \n"); for ( current = head ; current != NULL ; current = current->next ) { fprintf(fp, "\"%d\" \"%s\" \"%s\" \"%s\" \"%s\" \n", current->id, current->name, current->address, current->birth, current->phone_number); } fclose(fp); return ret; } int add_person( int id) { PERSON_t *data; int ret = NO_PROBLEM; data = (PERSON_t *)malloc(sizeof(PERSON_t)); //領域確保 data->id = id; //data->idに代入 printf("ID→"); printf("%d\n",data->id); get_person_name(data); get_person_address(data); get_person_birth(data); get_person_phone_number(data); if (head == NULL) //一回目は必ずここを通る { head = data; // リストが空の場合 新しいノードが、先頭かつ末尾になる tail = data; //先頭と末尾にdataをセット } else // リストに1件以上ノードが存在する場合 2回目からはここを通る { tail->next = data; // 末尾ノードのnextに、新しいノードの場所をセット tail = data; // 追加した新しいノードをtailとする } tail ->next = NULL; // 次のデータは無いので、nextにはNULLをセット return ret; }
回答1件
あなたの回答
tips
プレビュー