質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

連結リスト

連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

Q&A

解決済

1回答

2227閲覧

リスト構造体にファイルを読み込む

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

連結リスト

連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

0グッド

0クリップ

投稿2021/05/13 08:47

編集2021/05/13 11:15

構造体ポインタにファイルを読み込みたい

読み込みたい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; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/05/13 09:08

> 読み込みたいcsvファイル > "ID" "名前" "住所" "誕生日" "電話番号" > "1" "aaa" "bbb" "111" "222" これCSVじゃありません。カンマで区切られていないから。
退会済みユーザー

退会済みユーザー

2021/05/13 10:10

fscanfがタブで区切られるため、このように書き直してしまいました。txtファイルでも同様に、構造体ポインタに読み込まれません。
episteme

2021/05/13 10:56

なんにせよ元々の質問:「構造体ポインタに"csvファイル"を読み込みたいです」から外れてるので(少なくとも僕は)回答できません。
退会済みユーザー

退会済みユーザー

2021/05/13 11:16

質問文修正いたしました。 お時間があれば、回答していただけると幸いです。
guest

回答1

0

ベストアンサー

CSVの一行をカンマ区切りで読んでみた。

CSV

11,aaa,bbb,111,222 22,AAA,BBB,333,444

C

1#include <stdio.h> 2#include <string.h> 3#define NAME_LEM_MAX 10 4#define ADDRESS_LEM_MAX 64 5#define BIRTH_LEM_MAX 10 6#define NUMBER_LEM_MAX 16 7 8typedef struct student { 9 char id; 10 char name[NAME_LEM_MAX + 1]; 11 char address[ADDRESS_LEM_MAX + 1]; 12 char birth[BIRTH_LEM_MAX + 1]; 13 char phone_number[NUMBER_LEM_MAX + 1]; 14 struct student* next; // 次のデータがある場所 15} PERSON_t; 16 17int main() { 18 PERSON_t rec; 19 FILE* fp = fopen("test.csv", "r"); 20 char line[256]; 21 while ( fgets(line, 256, fp) ) { 22 rec.id = *strtok(line, ",\n"); 23 strcpy(rec.name, strtok(NULL,",\n")); 24 strcpy(rec.address, strtok(NULL, ",\n")); 25 strcpy(rec.birth, strtok(NULL, ",\n")); 26 strcpy(rec.phone_number, strtok(NULL, ",\n")); 27 rec.next = NULL; 28 29 printf("%c %s / %s / %s / %s\n", 30 rec.id, rec.name, rec.address, rec.birth, rec.phone_number); 31 } 32 fclose(fp); 33 return 0; 34}

投稿2021/05/13 11:43

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/05/15 00:31

ありがとうございます。 調べてみたところ、fscanfはあまり使わない方がよいのかもしれないですね。。。 解答していただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問