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

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

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

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

Q&A

2回答

619閲覧

csv形式でファイルから読み込んだものを重連結リストに格納する

yuma1919

総合スコア3

C

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

0グッド

0クリップ

投稿2023/05/31 08:43

編集2023/05/31 12:48

実現したいこと

csv形式でファイルから読み込んだものを重連結リストに格納する

前提

この部分をファイルにしたいです。 ### 発生している問題・エラーメッセージ csv形式でファイルから読み込んだものを重連結リストに格納仕方がわからない ### 該当のソースコード ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct __Soccercheck // 構造体 { int Ranking; // ランキング char Name[256]; // 選手の名前 char Team[256]; // チーム名 int Age; // 年齢 char Country[256]; // 国籍 int Number; // ゴール数 int Games; // 出場試合数 struct __Soccercheck *next; struct __Soccercheck *prev; } Soccercheck; Soccercheck *append(Soccercheck *tail, int rank, const char *name, const char *team, int age, const char *cou, int num, int game) // データを格納する関数 { Soccercheck *x = malloc(sizeof(Soccercheck)); x->Ranking = rank; strcpy(x->Name, name); strcpy(x->Team, team); x->Age = age; strcpy(x->Country, cou); x->Number = num; x->Games = game; x->next = tail->next; x->prev = tail; tail->next->prev = x; tail->next = x; tail = tail->next; return tail; } void dis(Soccercheck *tmp){ printf("サッカープレミアリーグ得点ランキング %2d 選手名 %s チーム名 %s 年齢 %d 国籍 %s ゴール数 %2d 出場試合数 %d\n", tmp->Ranking, tmp->Name, tmp->Team, tmp->Age, tmp->Country, tmp->Number, tmp->Games); printf("発見したデータに対応する構造体のアドレスは以下の通り。\n"); // アドレスの表示 printf("Ranking: %p\n", &tmp->Ranking); printf("Name: %p\n", &tmp->Name); printf("Team: %p\n", &tmp->Team); printf("Age: %p\n", &tmp->Age); printf("Country: %p\n", &tmp->Country); printf("Number: %p\n", &tmp->Number); printf("Games: %p\n", &tmp->Games); } int main(void) { Soccercheck *dommy = (Soccercheck *)malloc(sizeof(Soccercheck)); // ダミーノード Soccercheck *head = dommy; Soccercheck *tail = dommy; dommy->next = dommy; dommy->prev = dommy; tail = append(tail, 1, "ハーランド", "マンチェスターC", 22, "ノルウェー", 36, 33); tail = append(tail, 2, "ケーン", "トットナム", 29, "イングランド", 27, 36); tail = append(tail, 3, "トニー", "ブレントフォード", 27, "イングランド", 20, 33); tail = append(tail, 4, "サラー", "リバプール", 30, "エジプト", 19, 36); tail = append(tail, 5, "C・ウィルソン", "ニューカッスル", 31, "イングランド", 18, 29); tail = append(tail, 6, "ラッシュフォード", "マンチェスターU", 25, "イングランド", 16, 33); tail = append(tail, 7, "ウーデゴール", "アーセナル", 24, "ノルウェー", 15, 35); tail = append(tail, 7, "マルティネリ", "アーセナル", 21, "ブラジル", 15, 36); tail = append(tail, 9, "ワトキンス", "アストンビラ", 27, "イングランド", 14, 35); tail = append(tail, 10, "サカ", "アーセナル", 21, "イングランド", 13, 36); tail = append(tail, 11, "ロドリゴ", "リーズ", 32, "スペイン", 12, 29); tail = append(tail, 11, "バーンズ", "レスター", 25, "イングランド", 12, 32); tail = append(tail, 11, "ミトロビッチ", "フラム", 28, "セルビア", 12, 22); tail = append(tail, 14, "アルミロン", "ニューカッスル", 29, "パラグアイ", 11, 32); tail = append(tail, 15, "ガブリエル・ジェズス", "アーセナル", 26, "ブラジル", 10, 24); tail = append(tail, 15, "イサク", "ニューカッスル", 23, "スウェーデン", 10, 20); tail = append(tail, 15, "ソン・フンミン", "トットナム", 30, "韓国", 10, 34); tail = append(tail, 15, "フォーデン", "マンチェスターC", 22, "イングランド", 10, 29); tail = append(tail, 15, "マディソン", "レスター", 26, "イングランド", 10, 28); tail = append(tail, 15, "マック・アリスター", "ブライトン", 24, "アルゼンチン", 10, 32); tail = append(tail, 15, "エゼ", "クリスタルパレス", 24, "イングランド", 10, 36); tail = append(tail, 22, "フィルミノ", "リバプール", 31, "ブラジル", 9, 23); tail = append(tail, 22, "ヌニェス", "リバプール", 23, "ウルグアイ", 9, 29); tail = append(tail, 24, "トロサール", "アーセナル", 28, "ベルギー", 8, 34); tail = append(tail, 24, "アウォニイ", "ノッティンガム・フォレスト", 25, "ナイジェリア", 8, 25); tail = append(tail, 24, "ジョンソン", "ノッティンガム・フォレスト", 21, "ウェールズ", 8, 36); tail = append(tail, 24, "イングス", "ウエストハム", 30, "イングランド", 8, 33); tail = append(tail, 24, "アルバレス", "マンチェスターC", 23, "アルゼンチン", 8, 28); tail = append(tail, 24, "ギュンドアン", "マンチェスターC", 32, "ドイツ", 8, 30); tail = append(tail, 24, "ウォード・プラウズ", "サウサンプトン", 28, "イングランド", 8, 36); tail = append(tail, 24, "グロス", "ブライトン", 31, "ドイツ", 8, 34); tail = append(tail, 32, "三笘", "ブライトン", 25, "日本", 7, 30); int num = 0; Soccercheck *tmp = head->next; while (num != 8) // numが5の時終了 { printf("\nどのような操作をしますか?\n 1:一覧表字、2:検索(名前), 3:検索(チーム名), 4:検索(国名), 5:検索(ランキング), 6:検索(年齢), 7:削除, 8:終了 ->"); scanf("%d", &num); switch (num) { case 1: { // 一覧表字 tmp = head->next; while (1) { printf("サッカープレミアリーグ得点ランキング %2d 選手名 %s チーム名 %s 年齢 %d 国籍 %s ゴール数 %2d 出場試合数 %d\n", tmp->Ranking, tmp->Name, tmp->Team, tmp->Age, tmp->Country, tmp->Number, tmp->Games); tmp = tmp->next; if (tmp == head) break; } } break; case 2: { // 名前検索 char seek[10000]; printf("誰のことを知りたいですか?"); scanf("%s", seek); tmp = head->next; while (1) { if (strcmp(tmp->Name, seek) == 0) { dis(tmp); break; } tmp = tmp->next; if (tmp == head) // 該当するデータが見つからなかった時 { printf("\n%sさんのデータは見つかりませんでした。", seek); break; } } } break; case 3: { // チーム名検索 char team[10000]; printf("どのチームのことを知りたいですか?"); scanf("%s", team); tmp = head->next; while (1) { if (strcmp(tmp->Team, team) == 0) { dis(tmp); break; } tmp = tmp->next; if (tmp == head) // 該当するデータが見つからなかった時 { printf("\n%sさんのデータは見つかりませんでした。", team); break; } } } break; case 4: { // 国名検索 char cou[10000]; printf("どの国の人を知りたいですか?"); scanf("%s", cou); tmp = head->next; while (1) { if (strcmp(tmp->Country, cou) == 0) { dis(tmp); break; } tmp = tmp->next; if (tmp == head) // 該当するデータが見つからなかった時 { printf("\n%sさんのデータは見つかりませんでした。", cou); break; } } } break; case 5: { // ランキング検索 int rank = 0; printf("何位の人を知りたいですか?"); scanf("%d", &rank); tmp = head->next; while (1) { if (tmp->Ranking == rank) { dis(tmp); if (tmp->next->Ranking != rank) break; } tmp = tmp->next; if (tmp == head) // 該当するデータが見つからなかった時 { printf("\n%d位の人のデータは見つかりませんでした。", rank); break; } } } break; case 6: { // 年齢検索 int age = 0; printf("何歳の人を知りたいですか?"); scanf("%d", &age); tmp = head->next; int count=0; while (1) { if (tmp->Age == age) { dis(tmp); count++; } tmp = tmp->next; if (tmp == head) // 該当するデータが見つからなかった時 { if (count == 0){ printf("\n%d歳の人のデータは見つかりませんでした。", age); } break; } } } break; case 7: { // データの削除 char erase[10000]; printf("誰のデータを削除しますか?\n"); scanf("%s", erase); printf("%sさんのデータを削除します。\n", erase); tmp = head->next; while (1) { if (strcmp(tmp->Name, erase) == 0) { tmp->prev->next = tmp->next; tmp->next->prev = tmp->prev; free(tmp); tmp = head->next; while (1) { printf("サッカープレミアリーグ得点ランキング%d, 選手名%s, チーム名%s, 年齢%d, 国籍%s ゴール数%d, 出場試合数%d\n", tmp->Ranking, tmp->Name, tmp->Team, tmp->Age, tmp->Country, tmp->Number, tmp->Games); tmp = tmp->next; if (tmp == head) break; } break; } tmp = tmp->next; if (tmp == head) // 該当するデータが見つからなかった時 { printf("\n%sさんのデータは見つかりませんでした。", erase); break; } } } break; case 8: { printf("処理を終了します。"); } break; default: // 1〜7以外の数字がnumに入力された時 printf("numの値が不正です\n"); } } return 0; }

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

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

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

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

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

y_waiwai

2023/05/31 09:01

あなたの言う多重連結リストというのはどれのことなんでしょうか
jimbe

2023/05/31 11:29

dommy?
jimbe

2023/05/31 14:06

コードのマークダウンはコードだけに使用してください。
guest

回答2

0

CSV形式のファイルから読み込むんですよね。

C

1#include <stdio.h> // fopen, fclose, fscanf 2#include <stdlib.h> // malloc, free 3#include <string.h> // strcpy 4 5typedef struct __Soccercheck // 構造体 6{ 7 int Ranking; // ランキング 8 char Name[256]; // 選手名 9 char Team[256]; // チーム名 10 int Age; // 年齢 11 struct __Soccercheck *next; 12 struct __Soccercheck *prev; 13} Soccercheck; 14 15Soccercheck *append(Soccercheck *list, int rank, const char *name, const char *team, int age) 16{ 17 Soccercheck *x = malloc(sizeof(Soccercheck)); 18 if (x) { 19 x->Ranking = rank; 20 strcpy(x->Name, name); 21 strcpy(x->Team, team); 22 x->Age = age; 23 x->next = list->prev->next; 24 x->prev = list->prev; 25 list->prev->next = x; 26 list->prev = x; 27 } 28 return x; 29} 30 31void dis(Soccercheck *p) 32{ 33 printf("ランキング %2d 選手名 %s チーム名 %s 年齢 %d\n", 34 p->Ranking, p->Name, p->Team, p->Age); 35} 36 37int main(void) 38{ 39 Soccercheck *list = malloc(sizeof(Soccercheck)); 40 list->next = list->prev = list; 41 42 FILE *fp = fopen("data.csv", "r"); 43 if (!fp) return 1; 44 45 int rank, age; 46 char name[256], team[256]; 47 48 while (fscanf(fp, "%d,%[^,],%[^,],%d", &rank, name, team, &age) == 4) 49 append(list, rank, name, team, age); 50 51 fclose(fp); 52 53 for (Soccercheck *p = list->next; p != list; p = p->next) dis(p); 54}

data.csv

1,ハーランド,マンチェスターC,22 2,ケーン,トットナム,29 3,トニー,ブレントフォード,27 4,サラー,リバプール,30 5,C・ウィルソン,ニューカッスル,31 6,ラッシュフォード,マンチェスターU,25

実行結果

ランキング 1 選手名 ハーランド チーム名 マンチェスターC 年齢 22 ランキング 2 選手名 ケーン チーム名 トットナム 年齢 29 ランキング 3 選手名 トニー チーム名 ブレントフォード 年齢 27 ランキング 4 選手名 サラー チーム名 リバプール 年齢 30 ランキング 5 選手名 C・ウィルソン チーム名 ニューカッスル 年齢 31 ランキング 6 選手名 ラッシュフォード チーム名 マンチェスターU 年齢 25

投稿2023/05/31 12:10

編集2023/05/31 12:18
kazuma-s

総合スコア8224

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

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

yuma1919

2023/05/31 12:59

解答ありがとうございます。 解答してくださったのにうまく動かないのです ソースコードに続きがあって編集したのでご覧ください
kazuma-s

2023/06/01 01:19

「うまく動かない」では分かりません。 どんな入力を与えたら、どんな出力になってほしいのに、どんな表示になってしまったのかを具体的に提示してください。質問に追記してください。
guest

0

これでいい? (メモリ解放等の後始末は未実装)

C

1#define _CRT_SECURE_NO_WARNINGS 2#include <stdio.h> 3#include <stdlib.h> 4#include <string.h> 5 6typedef struct __SoccerRecord { // 構造体 7 int Ranking; // ランキング 8 char Name[256]; // 選手の名前 9 char Team[256]; // チーム名 10 int Age; // 年齢 11 char Country[256]; // 国籍 12 int Number; // ゴール数 13 int Games; // 出場試合数 14} SoccerRecord; 15 16SoccerRecord* make_record(int rank, const char *name, const char *team, int age, const char *cou, int num, int game) { 17 SoccerRecord* x = malloc(sizeof(SoccerRecord)); 18 if ( x != NULL ) { 19 x->Ranking = rank; 20 strcpy(x->Name, name); 21 strcpy(x->Team, team); 22 x->Age = age; 23 strcpy(x->Country, cou); 24 x->Number = num; 25 x->Games = game; 26 } 27 return x; 28} 29 30SoccerRecord* make_record_from_csv(const char* line) { 31 const char* delim = ",\t\n"; 32 char* buf = _strdup(line); 33 int ra = atoi(strtok(buf, delim)); 34 char* na = strtok(NULL,delim); 35 char* te = strtok(NULL,delim); 36 int ag = atoi(strtok(NULL, delim)); 37 char* co = strtok(NULL,delim); 38 int nu = atoi(strtok(NULL, delim)); 39 int ga = atoi(strtok(NULL, delim)); 40 SoccerRecord* result = make_record(ra,na,te,ag,co,nu,ga); 41 free(buf); 42 return result; 43} 44 45typedef struct __SoccerNode { 46 SoccerRecord* body; 47 struct __SoccerNode* next; 48 struct __SoccerNode* prev; 49} SoccerNode; 50 51typedef struct __SoccerList { 52 struct __SoccerNode *head; 53 struct __SoccerNode *tail; 54} SoccerList; 55 56// list の末尾に data を挿入する 57void append(SoccerList* list, SoccerRecord *data) { 58 SoccerNode* x = malloc(sizeof(SoccerNode)); 59 if ( x != NULL ) { 60 x->body = data; 61 x->next = NULL; 62 x->prev = NULL; 63 if ( list->head == NULL ) { 64 list->head = x; 65 list->tail = x; 66 } else { 67 x->prev = list->tail; 68 list->tail->next = x; 69 list->tail = x; 70 } 71 } 72} 73 74void dis(const SoccerRecord *tmp){ 75 printf("サッカープレミアリーグ得点ランキング %2d 選手名 %s チーム名 %s 年齢 %d 国籍 %s ゴール数 %2d 出場試合数 %d\n", 76 tmp->Ranking, tmp->Name, tmp->Team, tmp->Age, tmp->Country, tmp->Number, tmp->Games); 77} 78 79void print(const SoccerList* list) { 80 for ( SoccerNode* node = list->head; node != NULL; node = node->next ) { 81 dis(node->body); 82 } 83} 84 85int main(void) { 86 SoccerList list; 87 list.head = NULL; 88 list.tail = NULL; 89 90 FILE* fp = fopen("data.csv","r"); 91 char line[256]; 92 while ( fgets(line, 256, fp) ) { 93 append(&list, make_record_from_csv(line)); 94 } 95 fclose(fp); 96 print(&list); 97 return 0; 98}

data.csv

CSV

11, ハーランド, マンチェスターC, 22, ノルウェー, 36, 33 22, ケーン, トットナム, 29, イングランド, 27, 36 33, トニー, ブレントフォード, 27, イングランド, 20, 33 44, サラー, リバプール, 30, エジプト, 19, 36 55, C・ウィルソン, ニューカッスル, 31, イングランド, 18, 29 66, ラッシュフォード, マンチェスターU, 25, イングランド, 16, 33 77, ウーデゴール, アーセナル, 24, ノルウェー, 15, 35 87, マルティネリ, アーセナル, 21, ブラジル, 15, 36 99, ワトキンス, アストンビラ, 27, イングランド, 14, 35 1010, サカ, アーセナル, 21, イングランド, 13, 36 1111, ロドリゴ, リーズ, 32, スペイン, 12, 29 1211, バーンズ, レスター, 25, イングランド, 12, 32 1311, ミトロビッチ, フラム, 28, セルビア, 12, 22 1414, アルミロン, ニューカッスル, 29, パラグアイ, 11, 32 1515, ガブリエル・ジェズス, アーセナル, 26, ブラジル, 10, 24 1615, イサク, ニューカッスル, 23, スウェーデン, 10, 20 1715, ソン・フンミン, トットナム, 30, 韓国, 10, 34 1815, フォーデン, マンチェスターC, 22, イングランド, 10, 29 1915, マディソン, レスター, 26, イングランド, 10, 28 2015, マック・アリスター, ブライトン, 24, アルゼンチン, 10, 32 2115, エゼ, クリスタルパレス, 24, イングランド, 10, 36 2222, フィルミノ, リバプール, 31, ブラジル, 9, 23 2322, ヌニェス, リバプール, 23, ウルグアイ, 9, 29 2424, トロサール, アーセナル, 28, ベルギー, 8, 34 2524, アウォニイ, ノッティンガム・フォレスト, 25, ナイジェリア, 8, 25 2624, ジョンソン, ノッティンガム・フォレスト, 21, ウェールズ, 8, 36 2724, イングス, ウエストハム, 30, イングランド, 8, 33 2824, アルバレス, マンチェスターC, 23, アルゼンチン, 8, 28 2924, ギュンドアン, マンチェスターC, 32, ドイツ, 8, 30 3024, ウォード・プラウズ, サウサンプトン, 28, イングランド, 8, 36 3124, グロス, ブライトン, 31, ドイツ, 8, 34 3232, 三笘, ブライトン, 25, 日本, 7, 30

投稿2023/05/31 11:45

編集2023/06/01 04:47
episteme

総合スコア16614

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

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

jimbe

2023/05/31 17:41

ファイルは・・・
episteme

2023/06/01 04:49 編集

あ...ざくざくっと修正。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問