teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

readFile での新規要素の追加に insertItem を使うように修正

2019/08/28 06:35

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -69,8 +69,10 @@
69
69
 
70
70
  struct ST_MEMBER *readFile(char *filename) {
71
71
  FILE *fp;
72
- struct ST_MEMBER *top=NULL, *p=NULL;
72
+ struct ST_MEMBER head, *last = &head;
73
73
 
74
+ head.next = NULL;
75
+
74
76
  if(fopen_s(&fp, filename, "r") != 0) { //読み取りモードでファイルを開く
75
77
  printf("ファイルのオープンに失敗しました\n");
76
78
  return NULL;
@@ -81,8 +83,8 @@
81
83
  struct ST_MEMBER *new = (struct ST_MEMBER *)malloc(sizeof(struct ST_MEMBER));
82
84
  if(!new) {
83
85
  printf("メモリが確保できませんでした。\n");
84
- freeList(top); //確保した全てを開放する
86
+ freeList(head.next); //確保した全てを開放する
85
- top = NULL;
87
+ head.next = NULL;
86
88
  break;
87
89
  }
88
90
 
@@ -92,18 +94,14 @@
92
94
  break;
93
95
  }
94
96
 
95
- if(top == NULL) top = new;
96
-
97
97
  //既存の後ろに接続する
98
- new->prev = p;
99
- new->next = NULL;
100
- if(p) p->next = new;
98
+ insertItem(last, new);
101
- p = new;
99
+ last = new;
102
100
  }
103
101
 
104
102
  fclose(fp);
105
103
 
106
- return top;
104
+ return head.next;
107
105
  }
108
106
 
109
107
  //年齢を昇順に表示したいので年齢を比較する。

1

malloc 失敗時に fclose しないバグを修正

2019/08/28 06:35

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -82,7 +82,8 @@
82
82
  if(!new) {
83
83
  printf("メモリが確保できませんでした。\n");
84
84
  freeList(top); //確保した全てを開放する
85
- return NULL;
85
+ top = NULL;
86
+ break;
86
87
  }
87
88
 
88
89
  ret = fscanf(fp, "%4d%16s%5d%5s\n", &new->number, new->name, &new->age, new->gender);