質問編集履歴

2

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

2020/06/29 07:49

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  以下のソースコードで、Register関数を用いてファイルmemo.txtに入力した文字列配列をSearch関数で検索(出力)すると正しく表示されません。次のように出力するためにはどう修正したら良いのでしょうか。
8
8
 
9
- また、他に誤ったコードを記述している関数があれば教えて頂けると幸いです。
9
+
10
10
 
11
11
  宜しくお願い致します。
12
12
 
@@ -328,136 +328,46 @@
328
328
 
329
329
 
330
330
 
331
- //全データの閲覧
332
-
333
- void ListAll(InfoList list, FILE *fp){
334
-
335
- fp = fopen("memo.txt", "r");
336
-
337
- int ID;
338
-
339
- for(ID=1; ID<=SIZE; ID++){
340
-
341
- fscanf(fp, "%s", list[ID].name);
342
-
343
- fscanf(fp, "%s", list[ID].zipcode);
344
-
345
- fscanf(fp, "%s", list[ID].address);
346
-
347
- fscanf(fp, "%s", list[ID].tel);
348
-
349
- if(list[ID].name[0] == '\0') continue;
350
-
351
- printf("-------------------------------\n");
352
-
353
- OutputInfo(list, ID, fp);
354
-
355
- }
356
-
357
- }
358
-
359
-
360
-
361
- //既存のデータを空白に書き換え
362
-
363
- void Clear(Info *info){
364
-
365
- memset(info, '\0', sizeof(*info));
366
-
367
- }
368
-
369
-
370
-
371
- //データの削除
372
-
373
- void Delete(InfoList list, FILE *fp){
374
-
375
- fp = fopen("memo.txt", "a");
376
-
377
- printf("削除したいデータの");
378
-
379
- int ID = InputID();
380
-
381
- printf("データを削除しますか? 1.yes 2.no\n");
382
-
383
- while(true){
384
-
385
- int select = 0;
386
-
387
- if(scanf("%d", &select) != 1) exit(1);
388
-
389
- if(select == 1){
390
-
391
- fscanf(fp, "%s", list[ID]);
392
-
393
- Clear(&list[ID]);
394
-
395
- printf("データを削除しました。\n");
396
-
397
- return;
398
-
399
- }else if(select == 2){
400
-
401
- printf("削除を中止しました。\n");
402
-
403
- return;
331
+
332
+
333
+ //メインメニュー
334
+
335
+ int main(){
336
+
337
+ FILE *fp;
338
+
339
+ InfoList list;
340
+
341
+ int MenuID = 0;
342
+
343
+ while(MenuID != 5){
344
+
345
+ printf("---------------住所録プログラム--------------\n");
346
+
347
+ printf("1:登録\n");
348
+
349
+ printf("2:検索\n");
350
+
351
+ printf("3:終了\n");
352
+
353
+ printf("行う操作の番号を入力して下さい。\n");
354
+
355
+ if(scanf("%d", &MenuID) != 1) exit(1);
356
+
357
+ system("cls");
358
+
359
+ switch(MenuID){
360
+
361
+ case 1: Register(list, fp); break;
362
+
363
+ case 2: Search(list, fp); break;
364
+
365
+ case 3: return 0;
366
+
367
+ default: printf("不正な番号です。再入力して下さい。\n"); break;
404
368
 
405
369
  }
406
370
 
407
- printf("1か2を再入力して下さい。\n");
408
-
409
- }
410
-
411
- }
412
-
413
-
414
-
415
- //メインメニュー
416
-
417
- int main(){
418
-
419
- FILE *fp;
420
-
421
- InfoList list;
422
-
423
- int MenuID = 0;
424
-
425
- while(MenuID != 5){
426
-
427
- printf("---------------住所録プログラム--------------\n");
428
-
429
- printf("1:登録\n");
430
-
431
- printf("2:検索\n");
432
-
433
- printf("3:閲覧\n");
434
-
435
- printf("4:削除\n");
436
-
437
- printf("5:終了\n");
438
-
439
- printf("行う操作の番号を入力して下さい。\n");
440
-
441
- if(scanf("%d", &MenuID) != 1) exit(1);
442
-
443
- system("cls");
444
-
445
- switch(MenuID){
446
-
447
- case 1: Register(list, fp); break;
448
-
449
- case 2: Search(list, fp); break;
450
-
451
- case 3: ListAll(list, fp); break;
452
-
453
- case 4: Delete(list, fp); break;
454
-
455
- case 5: return 0;
456
-
457
- default: printf("不正な番号です。再入力して下さい。\n"); break;
458
-
459
- }
460
-
461
371
  }
462
372
 
463
373
  fclose(fp);

1

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

2020/06/29 07:49

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -4,23 +4,107 @@
4
4
 
5
5
  住所録プログラムを作成しています。
6
6
 
7
- 前回teratailのおかげでソースコード(以下に記載)は完成したのですが、名前などの情報をファイルに入出力する方法が分かりません。fprintfやfscanfを用いて数値をファイルに入出力する練習はしたのですが、文字列の扱いが難しく困っています。
8
-
9
- 様々なサイトを検索して回ったのですが、自分の知識では理解不可能でした。
10
-
11
- 以下のソースコードを修正し、1つのファイルmemo.txtから複今回は100人)の情報を入出力できなプログラムを作成て頂きたいで
7
+ 以下のソースコードで、Register関数用いてファイルmemo.txtに入力した文字列配列をSearch関で検索出力すると正しく表示されません。次ように出力ためにはど修正したら良しょうか
12
-
8
+
13
- また、どのような方法で構造体(文字列)ファイルから入出力すればよいのか、プログラミング初心者の自分にわかりやすく教えて頂けたら感謝でっぱいです。
9
+ また、他に誤ったコード記述している関数があれば教えて頂けると幸いです。
14
10
 
15
11
  宜しくお願い致します。
16
12
 
17
13
 
18
14
 
15
+ memo.txtの内容:
16
+
17
+ ```
18
+
19
+ A0000000placeA0000000000
20
+
21
+ B1111111placeB1111111111
22
+
23
+ C2222222placeC2222222222
24
+
25
+ ```
26
+
27
+ 以下のように表示したい:
28
+
29
+ ```
30
+
31
+ 検索したいIDは?(1~100)
32
+
33
+ 1
34
+
35
+ IDの認証に成功しました。
36
+
37
+ 名前:A
38
+
39
+ 郵便番号:0000000
40
+
41
+ 住所:placeA
42
+
43
+ 電話番号:00000000000
44
+
45
+
46
+
47
+ 検索したいIDは?(1~100)
48
+
49
+ 2
50
+
51
+ IDの認証に成功しました。
52
+
53
+ 名前:B
54
+
55
+ 郵便番号:1111111
56
+
57
+ 住所:placeB
58
+
59
+ 電話番号:1111111111
60
+
61
+
62
+
63
+ 検索したいIDは?(1~100)
64
+
65
+ 3
66
+
67
+ IDの認証に成功しました。
68
+
69
+ 名前:C
70
+
71
+ 郵便番号:2222222
72
+
73
+ 住所:placeC
74
+
75
+ 電話番号:2222222222
76
+
77
+ ```
78
+
79
+ 宜しくお願い致します。
80
+
81
+
82
+
19
83
  ### 発生している問題
20
84
 
21
-
85
+ 次のように表示されてしまう。
86
+
22
-
87
+ ```
88
+
89
+ 検索したいIDは?(1~100)
90
+
91
+ 1
92
+
93
+ IDの認証に成功しました。
94
+
95
+ ID:1
96
+
23
- 構造体(文字列)をファイルから入出力する方法が不明。
97
+ 名前:A0000000placeA0000000000
98
+
99
+ 郵便番号:B1111111placeB1111111111
100
+
101
+ 住所:C2222222placeC2222222222
102
+
103
+ 電話番号:
104
+
105
+
106
+
107
+ ```
24
108
 
25
109
 
26
110
 
@@ -118,10 +202,18 @@
118
202
 
119
203
  //ID・名前・郵便番号・住所・電話番号の出力
120
204
 
121
- void OutputInfo(InfoList list, int ID){
205
+ void OutputInfo(InfoList list, int ID, FILE *fp){
122
206
 
123
207
  printf("ID:%d\n", ID);
124
208
 
209
+ fscanf(fp, "%s", list[ID].name);
210
+
211
+ fscanf(fp, "%s", list[ID].zipcode);
212
+
213
+ fscanf(fp, "%s", list[ID].address);
214
+
215
+ fscanf(fp, "%s", list[ID].tel);
216
+
125
217
  printf("名前:%s\n",list[ID].name);
126
218
 
127
219
  printf("郵便番号:%s\n",list[ID].zipcode);
@@ -136,7 +228,9 @@
136
228
 
137
229
  //名前・郵便番号・住所・電話番号の登録
138
230
 
139
- void Register(InfoList list){
231
+ void Register(InfoList list, FILE *fp){
232
+
233
+ fp = fopen("memo.txt", "a");
140
234
 
141
235
  printf("登録したい");
142
236
 
@@ -144,6 +238,14 @@
144
238
 
145
239
  InputInfo(&list[ID]);
146
240
 
241
+ fprintf(fp, "%s", list[ID].name);
242
+
243
+ fprintf(fp, "%s", list[ID].zipcode);
244
+
245
+ fprintf(fp, "%s", list[ID].address);
246
+
247
+ fprintf(fp, "%s\n", list[ID].tel);
248
+
147
249
  printf("登録に成功しました。\n");
148
250
 
149
251
  }
@@ -152,7 +254,9 @@
152
254
 
153
255
  //個人情報の検索
154
256
 
155
- void Search(InfoList list){
257
+ void Search(InfoList list, FILE *fp){
258
+
259
+ fp = fopen("memo.txt", "r");
156
260
 
157
261
  int select, ID;
158
262
 
@@ -176,7 +280,7 @@
176
280
 
177
281
  ID = InputID();
178
282
 
179
- OutputInfo(list, ID);
283
+ OutputInfo(list, ID, fp);
180
284
 
181
285
  return;
182
286
 
@@ -210,7 +314,7 @@
210
314
 
211
315
  if(strcmp(field, target) == 0){
212
316
 
213
- OutputInfo(list, ID);
317
+ OutputInfo(list, ID, fp);
214
318
 
215
319
  found = true;
216
320
 
@@ -226,17 +330,27 @@
226
330
 
227
331
  //全データの閲覧
228
332
 
229
- void ListAll(InfoList list){
333
+ void ListAll(InfoList list, FILE *fp){
334
+
335
+ fp = fopen("memo.txt", "r");
230
336
 
231
337
  int ID;
232
338
 
233
339
  for(ID=1; ID<=SIZE; ID++){
234
340
 
341
+ fscanf(fp, "%s", list[ID].name);
342
+
343
+ fscanf(fp, "%s", list[ID].zipcode);
344
+
345
+ fscanf(fp, "%s", list[ID].address);
346
+
347
+ fscanf(fp, "%s", list[ID].tel);
348
+
235
349
  if(list[ID].name[0] == '\0') continue;
236
350
 
237
351
  printf("-------------------------------\n");
238
352
 
239
- OutputInfo(list, ID);
353
+ OutputInfo(list, ID, fp);
240
354
 
241
355
  }
242
356
 
@@ -256,7 +370,9 @@
256
370
 
257
371
  //データの削除
258
372
 
259
- void Delete(InfoList list){
373
+ void Delete(InfoList list, FILE *fp){
374
+
375
+ fp = fopen("memo.txt", "a");
260
376
 
261
377
  printf("削除したいデータの");
262
378
 
@@ -272,6 +388,8 @@
272
388
 
273
389
  if(select == 1){
274
390
 
391
+ fscanf(fp, "%s", list[ID]);
392
+
275
393
  Clear(&list[ID]);
276
394
 
277
395
  printf("データを削除しました。\n");
@@ -298,6 +416,8 @@
298
416
 
299
417
  int main(){
300
418
 
419
+ FILE *fp;
420
+
301
421
  InfoList list;
302
422
 
303
423
  int MenuID = 0;
@@ -324,13 +444,13 @@
324
444
 
325
445
  switch(MenuID){
326
446
 
327
- case 1: Register(list); break;
447
+ case 1: Register(list, fp); break;
328
-
448
+
329
- case 2: Search(list); break;
449
+ case 2: Search(list, fp); break;
330
-
450
+
331
- case 3: ListAll(list); break;
451
+ case 3: ListAll(list, fp); break;
332
-
452
+
333
- case 4: Delete(list); break;
453
+ case 4: Delete(list, fp); break;
334
454
 
335
455
  case 5: return 0;
336
456
 
@@ -340,6 +460,8 @@
340
460
 
341
461
  }
342
462
 
463
+ fclose(fp);
464
+
343
465
  }
344
466
 
345
467
 
@@ -348,11 +470,9 @@
348
470
 
349
471
  ###回答していただきたいこと
350
472
 
351
- ・上記ソースコードの修正版
352
-
353
- 文字列をファイルに紐づける方法
473
+ ターミナルに上記のように正しく表示する方法
354
-
474
+
355
- (両方答え頂けた有り難です)
475
+ ・何が間違っいるか文字列が正しく表示されなのか
356
476
 
357
477
 
358
478