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

質問編集履歴

2

質問の方法が不適切だったため、質問内容を変更しました。

2020/06/29 07:49

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -2,7 +2,7 @@
2
2
  C言語を始めて3か月の初心者です。
3
3
  住所録プログラムを作成しています。
4
4
  以下のソースコードで、Register関数を用いてファイルmemo.txtに入力した文字列配列をSearch関数で検索(出力)すると正しく表示されません。次のように出力するためにはどう修正したら良いのでしょうか。
5
- また、他に誤ったコードを記述している関数があれば教えて頂けると幸いです。
5
+
6
6
  宜しくお願い致します。
7
7
 
8
8
  memo.txtの内容:
@@ -163,48 +163,7 @@
163
163
  if(!found) printf("そのような%sは存在しません。\n", element[select]);
164
164
  }
165
165
 
166
- //全データの閲覧
167
- void ListAll(InfoList list, FILE *fp){
168
- fp = fopen("memo.txt", "r");
169
- int ID;
170
- for(ID=1; ID<=SIZE; ID++){
171
- fscanf(fp, "%s", list[ID].name);
172
- fscanf(fp, "%s", list[ID].zipcode);
173
- fscanf(fp, "%s", list[ID].address);
174
- fscanf(fp, "%s", list[ID].tel);
175
- if(list[ID].name[0] == '\0') continue;
176
- printf("-------------------------------\n");
177
- OutputInfo(list, ID, fp);
178
- }
179
- }
180
166
 
181
- //既存のデータを空白に書き換え
182
- void Clear(Info *info){
183
- memset(info, '\0', sizeof(*info));
184
- }
185
-
186
- //データの削除
187
- void Delete(InfoList list, FILE *fp){
188
- fp = fopen("memo.txt", "a");
189
- printf("削除したいデータの");
190
- int ID = InputID();
191
- printf("データを削除しますか? 1.yes 2.no\n");
192
- while(true){
193
- int select = 0;
194
- if(scanf("%d", &select) != 1) exit(1);
195
- if(select == 1){
196
- fscanf(fp, "%s", list[ID]);
197
- Clear(&list[ID]);
198
- printf("データを削除しました。\n");
199
- return;
200
- }else if(select == 2){
201
- printf("削除を中止しました。\n");
202
- return;
203
- }
204
- printf("1か2を再入力して下さい。\n");
205
- }
206
- }
207
-
208
167
  //メインメニュー
209
168
  int main(){
210
169
  FILE *fp;
@@ -214,18 +173,14 @@
214
173
  printf("---------------住所録プログラム--------------\n");
215
174
  printf("1:登録\n");
216
175
  printf("2:検索\n");
217
- printf("3:閲覧\n");
218
- printf("4:削除\n");
219
- printf("5:終了\n");
176
+ printf("3:終了\n");
220
177
  printf("行う操作の番号を入力して下さい。\n");
221
178
  if(scanf("%d", &MenuID) != 1) exit(1);
222
179
  system("cls");
223
180
  switch(MenuID){
224
181
  case 1: Register(list, fp); break;
225
182
  case 2: Search(list, fp); break;
226
- case 3: ListAll(list, fp); break;
227
- case 4: Delete(list, fp); break;
228
- case 5: return 0;
183
+ case 3: return 0;
229
184
  default: printf("不正な番号です。再入力して下さい。\n"); break;
230
185
  }
231
186
  }

1

質問の方法が不適切だったため、質問内容を変更しました。

2020/06/29 07:49

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,15 +1,57 @@
1
1
  ### 前提・実現したいこと
2
2
  C言語を始めて3か月の初心者です。
3
3
  住所録プログラムを作成しています。
4
- 前回teratailのおかげでソースコード(以下に記載)は完成したのですが、名前などの情報をファイルに入出力する方法が分かりません。fprintfやfscanfを用いて数値をファイルに入出力する練習はしたのですが、文字列の扱いが難しく困っています。
5
- 様々なサイトを検索して回ったのですが、自分の知識では理解不可能でした。
6
- 以下のソースコードを修正し、1つのファイルmemo.txtから複今回は100人)の情報を入出力できなプログラムを作成て頂きたいで
4
+ 以下のソースコードで、Register関数用いてファイルmemo.txtに入力した文字列配列をSearch関で検索出力すると正しく表示されません。次ように出力ためにはど修正したら良しょうか
7
- また、どのような方法で構造体(文字列)ファイルから入出力すればよいのか、プログラミング初心者の自分にわかりやすく教えて頂けたら感謝でっぱいです。
5
+ また、他に誤ったコード記述している関数があれば教えて頂けると幸いです。
8
6
  宜しくお願い致します。
9
7
 
8
+ memo.txtの内容:
9
+ ```
10
+ A0000000placeA0000000000
11
+ B1111111placeB1111111111
12
+ C2222222placeC2222222222
13
+ ```
14
+ 以下のように表示したい:
15
+ ```
16
+ 検索したいIDは?(1~100)
17
+ 1
18
+ IDの認証に成功しました。
19
+ 名前:A
20
+ 郵便番号:0000000
21
+ 住所:placeA
22
+ 電話番号:00000000000
23
+
24
+ 検索したいIDは?(1~100)
25
+ 2
26
+ IDの認証に成功しました。
27
+ 名前:B
28
+ 郵便番号:1111111
29
+ 住所:placeB
30
+ 電話番号:1111111111
31
+
32
+ 検索したいIDは?(1~100)
33
+ 3
34
+ IDの認証に成功しました。
35
+ 名前:C
36
+ 郵便番号:2222222
37
+ 住所:placeC
38
+ 電話番号:2222222222
39
+ ```
40
+ 宜しくお願い致します。
41
+
10
42
  ### 発生している問題
43
+ 次のように表示されてしまう。
44
+ ```
45
+ 検索したいIDは?(1~100)
46
+ 1
47
+ IDの認証に成功しました。
48
+ ID:1
49
+ 名前:A0000000placeA0000000000
50
+ 郵便番号:B1111111placeB1111111111
51
+ 住所:C2222222placeC2222222222
52
+ 電話番号:
11
53
 
12
- 構造体(文字列)をファイルから入出力する方法が不明。
54
+ ```
13
55
 
14
56
  ### 該当のソースコード
15
57
 
@@ -58,8 +100,12 @@
58
100
  }
59
101
 
60
102
  //ID・名前・郵便番号・住所・電話番号の出力
61
- void OutputInfo(InfoList list, int ID){
103
+ void OutputInfo(InfoList list, int ID, FILE *fp){
62
104
  printf("ID:%d\n", ID);
105
+ fscanf(fp, "%s", list[ID].name);
106
+ fscanf(fp, "%s", list[ID].zipcode);
107
+ fscanf(fp, "%s", list[ID].address);
108
+ fscanf(fp, "%s", list[ID].tel);
63
109
  printf("名前:%s\n",list[ID].name);
64
110
  printf("郵便番号:%s\n",list[ID].zipcode);
65
111
  printf("住所:%s\n",list[ID].address);
@@ -67,15 +113,21 @@
67
113
  }
68
114
 
69
115
  //名前・郵便番号・住所・電話番号の登録
70
- void Register(InfoList list){
116
+ void Register(InfoList list, FILE *fp){
117
+ fp = fopen("memo.txt", "a");
71
118
  printf("登録したい");
72
119
  int ID = InputID();
73
120
  InputInfo(&list[ID]);
121
+ fprintf(fp, "%s", list[ID].name);
122
+ fprintf(fp, "%s", list[ID].zipcode);
123
+ fprintf(fp, "%s", list[ID].address);
124
+ fprintf(fp, "%s\n", list[ID].tel);
74
125
  printf("登録に成功しました。\n");
75
126
  }
76
127
 
77
128
  //個人情報の検索
78
- void Search(InfoList list){
129
+ void Search(InfoList list, FILE *fp){
130
+ fp = fopen("memo.txt", "r");
79
131
  int select, ID;
80
132
  char *element[] = {"", "ID", "名前", "郵便番号", "住所", "電話番号"};
81
133
  while(true){
@@ -87,7 +139,7 @@
87
139
  if(select == 1){
88
140
  printf("検索したい");
89
141
  ID = InputID();
90
- OutputInfo(list, ID);
142
+ OutputInfo(list, ID, fp);
91
143
  return;
92
144
  }
93
145
  printf("検索する%sを入力して下さい。\n", element[select]);
@@ -104,7 +156,7 @@
104
156
  default: break;
105
157
  }
106
158
  if(strcmp(field, target) == 0){
107
- OutputInfo(list, ID);
159
+ OutputInfo(list, ID, fp);
108
160
  found = true;
109
161
  }
110
162
  }
@@ -112,12 +164,17 @@
112
164
  }
113
165
 
114
166
  //全データの閲覧
115
- void ListAll(InfoList list){
167
+ void ListAll(InfoList list, FILE *fp){
168
+ fp = fopen("memo.txt", "r");
116
169
  int ID;
117
170
  for(ID=1; ID<=SIZE; ID++){
171
+ fscanf(fp, "%s", list[ID].name);
172
+ fscanf(fp, "%s", list[ID].zipcode);
173
+ fscanf(fp, "%s", list[ID].address);
174
+ fscanf(fp, "%s", list[ID].tel);
118
175
  if(list[ID].name[0] == '\0') continue;
119
176
  printf("-------------------------------\n");
120
- OutputInfo(list, ID);
177
+ OutputInfo(list, ID, fp);
121
178
  }
122
179
  }
123
180
 
@@ -127,7 +184,8 @@
127
184
  }
128
185
 
129
186
  //データの削除
130
- void Delete(InfoList list){
187
+ void Delete(InfoList list, FILE *fp){
188
+ fp = fopen("memo.txt", "a");
131
189
  printf("削除したいデータの");
132
190
  int ID = InputID();
133
191
  printf("データを削除しますか? 1.yes 2.no\n");
@@ -135,6 +193,7 @@
135
193
  int select = 0;
136
194
  if(scanf("%d", &select) != 1) exit(1);
137
195
  if(select == 1){
196
+ fscanf(fp, "%s", list[ID]);
138
197
  Clear(&list[ID]);
139
198
  printf("データを削除しました。\n");
140
199
  return;
@@ -148,6 +207,7 @@
148
207
 
149
208
  //メインメニュー
150
209
  int main(){
210
+ FILE *fp;
151
211
  InfoList list;
152
212
  int MenuID = 0;
153
213
  while(MenuID != 5){
@@ -161,21 +221,21 @@
161
221
  if(scanf("%d", &MenuID) != 1) exit(1);
162
222
  system("cls");
163
223
  switch(MenuID){
164
- case 1: Register(list); break;
224
+ case 1: Register(list, fp); break;
165
- case 2: Search(list); break;
225
+ case 2: Search(list, fp); break;
166
- case 3: ListAll(list); break;
226
+ case 3: ListAll(list, fp); break;
167
- case 4: Delete(list); break;
227
+ case 4: Delete(list, fp); break;
168
228
  case 5: return 0;
169
229
  default: printf("不正な番号です。再入力して下さい。\n"); break;
170
230
  }
171
231
  }
232
+ fclose(fp);
172
233
  }
173
234
 
174
235
  ```
175
236
  ###回答していただきたいこと
176
- ・上記ソースコードの修正版
177
- 文字列をファイルに紐づける方法
237
+ ターミナルに上記のように正しく表示する方法
178
- (両方答え頂けた有り難です)
238
+ ・何が間違っいるか文字列が正しく表示されなのか
179
239
 
180
240
  ### 補足情報
181
241