質問編集履歴

1

関数data_delete1()に絞りました。

2017/12/18 11:51

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- 名前と番号のデータを削除する関数と、修正する関数を作りたい
1
+ 名前と番号のデータを削除する関数を作りたい
test CHANGED
@@ -1,15 +1,93 @@
1
- 以下のプログラムにデータを削除する関数と、修正する関数を作りたいのですが、
1
+ 以下のデータを削除する関数を作りたいのですが、
2
-
3
- void data_amend(),void data_delete()でデータを削除するコードが
2
+
4
-
5
- 分かりません。void data_amend(),void data_delete()は追加したコードです。
6
-
7
- 追加のまえのプログラムは正常に動きました。
8
-
9
- void data_amend(),void data_delete()のコードの不備、誤りを教えてください。
3
+ void data_delete()のコードの不備、誤りを教えてください。
4
+
5
+ とりあえずここまでできています。
6
+
7
+ void data_delete()でデータを削除するコードが分かりません。
10
8
 
11
9
  ```コード
12
10
 
11
+ /*これはdata_telというファイルを操作するプログラムでいいのかな?
12
+
13
+
14
+
15
+ 削除の実装は標準Cだけだとかなりだるい。
16
+
17
+
18
+
19
+ 別ファイルに書き出して元ファイル削除してリネームという手法になる。
20
+
21
+
22
+
23
+ ファイル削除はremove、ファイル名変更はrenameを使う。
24
+
25
+
26
+
27
+ つまり
28
+
29
+
30
+
31
+ 現状のコード同様文字列検索する。
32
+
33
+ 1. 一つでも見つかったらfstatでファイルサイズを求める
34
+
35
+
36
+
37
+ 2. ファイルサイズ分のメモリーを確保
38
+
39
+
40
+
41
+ 3.fseekでファイル先頭に戻り、freadですべて確保したメモリーへ読み込み。
42
+
43
+ 一時ファイルのハンドルを得る
44
+
45
+
46
+
47
+ 4.strstrを駆使しながら削除部分以外を一時ファイルにfwriteで書き込み(大変)
48
+
49
+
50
+
51
+ 全ファイルハンドルclose
52
+
53
+ 5.data_telをremove
54
+
55
+
56
+
57
+ 6.一時ファイルをdata_telにrename
58
+
59
+
60
+
61
+
62
+
63
+ というくっそ面倒なことやることになる。
64
+
65
+ data_amend()
66
+
67
+
68
+
69
+ */
70
+
71
+
72
+
73
+ /* data_tel
74
+
75
+ naka 080-7777
76
+
77
+ kiyoko 090-9999
78
+
79
+ satou 090-3214
80
+
81
+ kinosita 080-8679
82
+
83
+ yamada 090-4325
84
+
85
+ */
86
+
87
+
88
+
89
+
90
+
13
91
  #include<stdio.h>
14
92
 
15
93
  #include<string.h> //for strcmp,strstr
@@ -22,6 +100,8 @@
22
100
 
23
101
  #define MAX 100 // MAX100人
24
102
 
103
+
104
+
25
105
  char names[MAX][20]; // MAX100人、20文字
26
106
 
27
107
  char tel[MAX][20]; // MAX100人、20文字
@@ -30,494 +110,216 @@
30
110
 
31
111
 
32
112
 
33
- int menu(); // メニュー関数
34
-
35
- void data_add(); // データの追加、名前と番号の入力
36
-
37
- void data_search(); // ファイル中のデータの検索
38
-
39
- void data_write(); // データセーブ
40
-
41
113
  void data_show(); // データ表示
42
114
 
43
- void data_append(); // 追加セーブ
44
-
45
- void data_amend();
46
-
47
115
  void data_delete();
48
116
 
117
+
118
+
119
+ int main()
120
+
121
+ {
122
+
123
+
124
+
125
+ data_delete();
126
+
127
+
128
+
129
+ data_show();
130
+
131
+
132
+
133
+ }
134
+
135
+
136
+
137
+ void data_show()
138
+
139
+ {
140
+
141
+ FILE *fp;
142
+
143
+ val=0;
144
+
145
+
146
+
147
+ if(!(fp = fopen("data_tel.txt", "r"))){
148
+
149
+ printf("ファイルを開くことができません\n");
150
+
151
+ exit(1);
152
+
153
+ }
154
+
155
+ printf("名前番号\n");
156
+
157
+
158
+
159
+ printf("-------------------------\n");
160
+
161
+
162
+
163
+ while(fscanf(fp, "%s%s", names[val], tel[val])!=-1)
164
+
165
+ {
166
+
167
+ printf("%-10s%5s\n",names[val], tel[val]);
168
+
169
+
170
+
171
+ val++;
172
+
173
+ }
174
+
175
+ fclose(fp);
176
+
177
+ }
178
+
179
+
180
+
181
+ void data_delete() {
182
+
183
+ static char buff[N];
184
+
185
+ FILE *fp;
186
+
187
+ int len;
188
+
189
+ int i=0;
190
+
191
+ val=0;
192
+
193
+
194
+
195
+ if(!(fp = fopen("data_tel.txt", "r"))){
196
+
197
+ printf("ファイルを開くことができません\n");
198
+
199
+ exit(1);
200
+
201
+ }
202
+
203
+ printf("削除する名前を検索します。検索する名前を入力して下さい。\n");
204
+
205
+
206
+
207
+ scanf("%s",buff);
208
+
209
+
210
+
211
+ while(fscanf(fp, "%s%s", names[val], tel[val])!=-1){
212
+
213
+ //fscanfでファイルを1行ずつ読み込む
214
+
215
+ // while( fscanf(fp,"%s,%s",&buf[0],&buf[1]) != EOF ){
216
+
217
+ // printf("%s,%s\n",buf[0],buf[1]);
218
+
219
+
220
+
221
+ if(strstr(names[val],buff) || strstr(tel[val],buff)){
222
+
223
+ //文字列namesの中から文字列buffを探しそのアドレスを返す。
224
+
225
+ //発見できなければNULL(\0)を返す。
226
+
227
+
228
+
229
+ printf("%-10s%5s\n",names[val],tel[val]);
230
+
231
+ i=1;
232
+
233
+
234
+
235
+ len = strlen( &names[100][20]);
236
+
237
+ // 文字列namesの長さを返す。
238
+
239
+ // strlen関数は文字列の長さを「バイト数」で返します。
240
+
241
+ // namesの長さは20バイト, telの長さは20バイト,\0がついているので
242
+
243
+ // データ1行の長さは42バイト
244
+
245
+
246
+
247
+ printf( "len=%d\n" , len );
248
+
249
+
250
+
251
+
252
+
253
+ //見つかると削除する(ここで削除したい)
254
+
255
+ }
256
+
257
+
258
+
259
+ }
260
+
261
+ printf("削除された名前: %s\n", buff);
262
+
263
+ if(i==0)
264
+
265
+ printf("名前が見つかりません: %s\n", buff);
266
+
267
+ fclose(fp);
268
+
269
+
270
+
271
+
272
+
273
+ }
274
+
275
+
276
+
277
+ /*実行結果
278
+
279
+ naka@naka ~/kadai
280
+
281
+ $ gcc -o data_delete1 data_delete1.c -Wall
282
+
283
+
284
+
285
+ naka@naka ~/kadai
286
+
287
+ $ data_delete1
288
+
289
+ 削除する名前を検索します。検索する名前を入力して下さい。
290
+
291
+ kiyoko //関数scanfの表示
292
+
293
+ kiyoko 090-9999 //関数data_delete1の表示
294
+
295
+ len=4
296
+
297
+ 削除された名前: kiyoko
298
+
299
+ 名前番号 //関数data_show();の表示
300
+
301
+ -------------------------
302
+
303
+ naka 080-7777
304
+
305
+ kiyoko 090-9999
306
+
307
+ satou 090-3214
308
+
309
+ kinosita 080-8679
310
+
311
+ yamada 090-4325
312
+
313
+
314
+
315
+ naka@naka ~/kadai
316
+
317
+ */
318
+
49
319
 
50
320
 
51
- int main()
321
+
52
-
53
- {
322
+
54
-
55
- int choice;
323
+
56
-
57
-
58
-
59
- do{
60
-
61
- choice = menu(); // menu()の返す値をswitch()に代入
62
-
63
- switch(choice) {
64
-
65
- case 1: data_add();break;
66
-
67
-
68
-
69
- case 2: data_write();break;
70
-
71
-
72
-
73
- case 3: data_append();break;
74
-
75
-
76
-
77
- case 4: data_show();break;
78
-
79
-
80
-
81
- case 5: data_search();break;
82
-
83
-
84
-
85
- case 6: data_delete();break;
86
-
87
-
88
-
89
- case 7: data_amend();break;
90
-
91
-
92
-
93
- case 0:
94
-
95
- printf("プログラムを終了します");
96
-
97
- break;
98
-
99
- }
100
-
101
- }while(choice!=0);
102
-
103
- return 0;
104
-
105
- }
106
-
107
-
108
-
109
- int menu()
110
-
111
- {
112
-
113
- int select;
114
-
115
-
116
-
117
- printf("--【 MENU 】---------\n");
118
-
119
-
120
-
121
- printf("[1] 名前と番号の入力\n");
122
-
123
-
124
-
125
- printf("[2] セーブ\n");
126
-
127
-
128
-
129
- printf("[3] 上書きデータセーブ\n");
130
-
131
-
132
-
133
- printf("[4] 表\示\n");
134
-
135
-
136
-
137
- printf("[5] 文字検索\n");
138
-
139
-
140
-
141
- printf("[6] データの削除\n");
142
-
143
-
144
-
145
- printf("[7] データの修正\n");
146
-
147
-
148
-
149
- printf("[0] 終了\n");
150
-
151
-
152
-
153
- printf("-----------------------\n");
154
-
155
-
156
-
157
- printf("番号選択 [0 ~ 7]?");
158
-
159
-
160
-
161
- scanf("%d",&select);
162
-
163
-
164
-
165
- if(!(select==1||select==2||select==3||select==4||select==5||select==6||select==7||select==0))
166
-
167
- {
168
-
169
- printf("番号が不正です");
170
-
171
- exit(1);
172
-
173
- }
174
-
175
- return select;
176
-
177
- }
178
-
179
-
180
-
181
-
182
-
183
- void data_add()
184
-
185
- {
186
-
187
- for(val=0;val<MAX;val++)
188
-
189
- {
190
-
191
- printf("名前と電話番号の入力をします。(MAX=100人)\n");
192
-
193
-
194
-
195
- printf("終了するときは「 z 」を入力して下さい。\n");
196
-
197
-
198
-
199
- printf("名前は?");
200
-
201
-
202
-
203
- scanf("%s", names[val]);
204
-
205
-
206
-
207
- if(strcmp(names[val],"z")==0 || strcmp(names[val],"Z")==0) break;
208
-
209
-
210
-
211
- printf("番号は?");
212
-
213
-
214
-
215
- scanf("%s",tel[val]);
216
-
217
-
218
-
219
- }
220
-
221
- if(val>=MAX)
222
-
223
- printf("これ以上は入力できません。\n");
224
-
225
- }
226
-
227
-
228
-
229
- void data_write()
230
-
231
- {
232
-
233
- FILE *fp;
234
-
235
- int i;
236
-
237
-
238
-
239
- if(!(fp = fopen("data_tel", "w"))){
240
-
241
- printf("ファイルを開くことができません\n");
242
-
243
- exit(1);
244
-
245
- }
246
-
247
- for(i=0; i<val; i++){
248
-
249
- fprintf(fp, "%-15s %15s\n",names[i], tel[i]);//-15sは左詰め
250
-
251
- }
252
-
253
- fclose(fp);
254
-
255
- printf("ファイルにセーブしました。\n");
256
-
257
- }
258
-
259
-
260
-
261
- void data_append()
262
-
263
- {
264
-
265
- FILE *fp;
266
-
267
- int i;
268
-
269
-
270
-
271
- if(!(fp = fopen("data_tel", "a"))){
272
-
273
- printf("ファイルを開くことができません\n");
274
-
275
- exit(1);
276
-
277
- }
278
-
279
- for(i=0; i<val; i++){
280
-
281
- fprintf(fp, "%-15s %5s\n",names[i], tel[i]);
282
-
283
- }
284
-
285
- fclose(fp);
286
-
287
- printf("ファイルに追加セーブしました。\n");
288
-
289
- }
290
-
291
-
292
-
293
- void data_show()
294
-
295
- {
296
-
297
- FILE *fp;
298
-
299
- val=0;
300
-
301
-
302
-
303
- if(!(fp = fopen("data_tel", "r"))){
304
-
305
- printf("ファイルを開くことができません\n");
306
-
307
- exit(1);
308
-
309
- }
310
-
311
- printf("名前番号\n");
312
-
313
-
314
-
315
- printf("-------------------------\n");
316
-
317
-
318
-
319
- while(fscanf(fp, "%s%s", names[val], tel[val])!=-1)
320
-
321
- {
322
-
323
- printf("%-15s%5s\n",names[val], tel[val]);
324
-
325
-
326
-
327
- val++;
328
-
329
- }
330
-
331
- fclose(fp);
332
-
333
- }
334
-
335
-
336
-
337
- void data_search()
338
-
339
- {
340
-
341
- FILE *fp;
342
-
343
- char word[10];
344
-
345
- int i=0;
346
-
347
- val=0;
348
-
349
-
350
-
351
- if(!(fp = fopen("data_tel", "r")))
352
-
353
- {
354
-
355
- printf("ファイルを開くことができません\n");
356
-
357
- exit(1);
358
-
359
- }
360
-
361
- printf("文字を検索します。検索する文字を入力して下さい。\n");
362
-
363
-
364
-
365
- printf("検索文字?(10文字まで)=");
366
-
367
-
368
-
369
- scanf("%s",word); // オリジナルは&wordになっていてエラーになる。
370
-
371
-
372
-
373
- while(fscanf(fp, "%s%s", names[val], tel[val])!=-1)
374
-
375
- {
376
-
377
- if(strstr(names[val],word) || strstr(tel[val],word))
378
-
379
- {
380
-
381
- printf("%-10s%5s\n",names[val],tel[val]);i=1;
382
-
383
- }
384
-
385
- }
386
-
387
- if(i==0)
388
-
389
- printf("該当データなし\n");
390
-
391
-
392
-
393
- fclose(fp);
394
-
395
- }
396
-
397
-
398
-
399
- void data_delete() {
400
-
401
-   static char buff[N];
402
-
403
-   FILE *fp;
404
-
405
-   int i=0;
406
-
407
-   val=0;
408
-
409
-
410
-
411
-   if(!(fp = fopen("data_tel", "r"))){
412
-
413
-   printf("ファイルを開くことができません\n");
414
-
415
-   exit(1);
416
-
417
-   }
418
-
419
-   printf("削除する名前を検索します。検索する名前を入力して下さい。\n");
420
-
421
-    scanf("%s",buff);
422
-
423
-
424
-
425
-   while(fscanf(fp, "%s%s", names[val], tel[val])!=-1){
426
-
427
-   if(strstr(names[val],buff) || strstr(tel[val],buff){
428
-
429
-    printf("%-10s%5s\n",names[val],tel[val]);
430
-
431
-
432
-
433
-          //{見つかると削除するコード};
434
-
435
-  printf("削除された名前: %s\n", buff);
436
-
437
-   }
438
-
439
-   }
440
-
441
-   if(i==0)
442
-
443
- printf("名前が見つかりません: %s\n", buff);
444
-
445
-   fclose(fp);
446
-
447
-    data_show();
448
-
449
- }
450
-
451
-
452
-
453
- void data_amend() {
454
-
455
- static char buff[N];
456
-
457
- FILE *fp;
458
-
459
- int i=0;
460
-
461
- val=0;
462
-
463
-
464
-
465
- if(!(fp = fopen("data_tel", "r"))){
466
-
467
- printf("ファイルを開くことができません\n");
468
-
469
- exit(1);
470
-
471
- }
472
-
473
- printf("修正する名前と番号を検索します。検索する名前、番号を入力して下さい。\n");
474
-
475
-  
476
-
477
- scanf("%s",buff);
478
-
479
-
480
-
481
- while(fscanf(fp, "%s%s", names[val], tel[val])!=-1){
482
-
483
- if(strstr(names[val],buff) || strstr(tel[val],buff)){
484
-
485
- printf("%-10s%5s\n",names[val],tel[val]);
486
-
487
- i=1;
488
-
489
-
490
-
491
- //見つかると修正する
492
-
493
- for(val=0;val<MAX;val++){
494
-
495
- puts("変更しない場合は単に[return]を押して下さい");
496
-
497
- names[val]=buff;
498
-
499
- tel[val]=buff;
500
-
501
- }
502
-
503
- if(val>=MAX){
504
-
505
- printf("これ以上は入力できません。\n");
506
-
507
- }
508
-
509
- }
510
-
511
- if(i==0)
512
-
513
- printf("名前、番号が見つかりません: %s\n", buff);
514
-
515
- fclose(fp);
516
-
517
- data_show();
518
-
519
- }
520
-
521
- }
522
324
 
523
325
  ```