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

質問編集履歴

1

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

2017/12/18 11:51

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- 名前と番号のデータを削除する関数と、修正する関数を作りたい
1
+ 名前と番号のデータを削除する関数を作りたい
body CHANGED
@@ -1,155 +1,77 @@
1
- 以下のプログラムにデータを削除する関数と、修正する関数を作りたいのですが、
1
+ 以下のデータを削除する関数を作りたいのですが、
2
- void data_amend(),void data_delete()でデータを削除するコードが
3
- 分かりません。void data_amend(),void data_delete()は追加したコードです。
4
- 追加のまえのプログラムは正常に動きました。
5
- void data_amend(),void data_delete()のコードの不備、誤りを教えてください。
2
+ void data_delete()のコードの不備、誤りを教えてください。
3
+ とりあえずここまでできています。
4
+ void data_delete()でデータを削除するコードが分かりません。
6
5
  ```コード
6
+ /*これはdata_telというファイルを操作するプログラムでいいのかな?
7
+
8
+ 削除の実装は標準Cだけだとかなりだるい。
9
+
10
+ 別ファイルに書き出して元ファイル削除してリネームという手法になる。
11
+
12
+ ファイル削除はremove、ファイル名変更はrenameを使う。
13
+
14
+ つまり
15
+
16
+ 現状のコード同様文字列検索する。
17
+ 1. 一つでも見つかったらfstatでファイルサイズを求める
18
+
19
+ 2. ファイルサイズ分のメモリーを確保
20
+
21
+ 3.fseekでファイル先頭に戻り、freadですべて確保したメモリーへ読み込み。
22
+ 一時ファイルのハンドルを得る
23
+
24
+ 4.strstrを駆使しながら削除部分以外を一時ファイルにfwriteで書き込み(大変)
25
+
26
+ 全ファイルハンドルclose
27
+ 5.data_telをremove
28
+
29
+ 6.一時ファイルをdata_telにrename
30
+
31
+
32
+ というくっそ面倒なことやることになる。
33
+ data_amend()
34
+
35
+ */
36
+
37
+ /* data_tel
38
+ naka 080-7777
39
+ kiyoko 090-9999
40
+ satou 090-3214
41
+ kinosita 080-8679
42
+ yamada 090-4325
43
+ */
44
+
45
+
7
46
  #include<stdio.h>
8
47
  #include<string.h> //for strcmp,strstr
9
48
  #include<stdlib.h> //for exit
10
49
 
11
50
  #define N 256
12
51
  #define MAX 100 // MAX100人
52
+
13
53
  char names[MAX][20]; // MAX100人、20文字
14
54
  char tel[MAX][20]; // MAX100人、20文字
15
55
  int val; // 名前と番号の配列番号
16
56
 
17
- int menu(); // メニュー関数
18
- void data_add(); // データの追加、名前と番号の入力
19
- void data_search(); // ファイル中のデータの検索
20
- void data_write(); // データセーブ
21
57
  void data_show(); // データ表示
22
- void data_append(); // 追加セーブ
23
- void data_amend();
24
58
  void data_delete();
25
-
59
+
26
60
  int main()
27
61
  {
28
- int choice;
62
+
29
-
30
- do{
31
- choice = menu(); // menu()の返す値をswitch()に代入
32
- switch(choice) {
33
- case 1: data_add();break;
34
-
35
- case 2: data_write();break;
36
-
37
- case 3: data_append();break;
38
-
39
- case 4: data_show();break;
40
-
41
- case 5: data_search();break;
42
-
43
- case 6: data_delete();break;
63
+ data_delete();
44
-
45
- case 7: data_amend();break;
64
+
46
-
47
- case 0:
48
- printf("プログラムを終了します");
49
- break;
50
- }
51
- }while(choice!=0);
65
+ data_show();
52
- return 0;
66
+
53
67
  }
54
68
 
55
- int menu()
56
- {
57
- int select;
58
-
59
- printf("--【 MENU 】---------\n");
60
-
61
- printf("[1] 名前と番号の入力\n");
62
-
63
- printf("[2] セーブ\n");
64
-
65
- printf("[3] 上書きデータセーブ\n");
66
-
67
- printf("[4] 表\示\n");
68
-
69
- printf("[5] 文字検索\n");
70
-
71
- printf("[6] データの削除\n");
72
-
73
- printf("[7] データの修正\n");
74
-
75
- printf("[0] 終了\n");
76
-
77
- printf("-----------------------\n");
78
-
79
- printf("番号選択 [0 ~ 7]?");
80
-
81
- scanf("%d",&select);
82
-
83
- if(!(select==1||select==2||select==3||select==4||select==5||select==6||select==7||select==0))
84
- {
85
- printf("番号が不正です");
86
- exit(1);
87
- }
88
- return select;
89
- }
90
-
91
-
92
- void data_add()
93
- {
94
- for(val=0;val<MAX;val++)
95
- {
96
- printf("名前と電話番号の入力をします。(MAX=100人)\n");
97
-
98
- printf("終了するときは「 z 」を入力して下さい。\n");
99
-
100
- printf("名前は?");
101
-
102
- scanf("%s", names[val]);
103
-
104
- if(strcmp(names[val],"z")==0 || strcmp(names[val],"Z")==0) break;
105
-
106
- printf("番号は?");
107
-
108
- scanf("%s",tel[val]);
109
-
110
- }
111
- if(val>=MAX)
112
- printf("これ以上は入力できません。\n");
113
- }
114
-
115
- void data_write()
116
- {
117
- FILE *fp;
118
- int i;
119
-
120
- if(!(fp = fopen("data_tel", "w"))){
121
- printf("ファイルを開くことができません\n");
122
- exit(1);
123
- }
124
- for(i=0; i<val; i++){
125
- fprintf(fp, "%-15s %15s\n",names[i], tel[i]);//-15sは左詰め
126
- }
127
- fclose(fp);
128
- printf("ファイルにセーブしました。\n");
129
- }
130
-
131
- void data_append()
132
- {
133
- FILE *fp;
134
- int i;
135
-
136
- if(!(fp = fopen("data_tel", "a"))){
137
- printf("ファイルを開くことができません\n");
138
- exit(1);
139
- }
140
- for(i=0; i<val; i++){
141
- fprintf(fp, "%-15s %5s\n",names[i], tel[i]);
142
- }
143
- fclose(fp);
144
- printf("ファイルに追加セーブしました。\n");
145
- }
146
-
147
69
  void data_show()
148
70
  {
149
71
  FILE *fp;
150
72
  val=0;
151
73
 
152
- if(!(fp = fopen("data_tel", "r"))){
74
+ if(!(fp = fopen("data_tel.txt", "r"))){
153
75
  printf("ファイルを開くことができません\n");
154
76
  exit(1);
155
77
  }
@@ -159,104 +81,83 @@
159
81
 
160
82
  while(fscanf(fp, "%s%s", names[val], tel[val])!=-1)
161
83
  {
162
- printf("%-15s%5s\n",names[val], tel[val]);
84
+ printf("%-10s%5s\n",names[val], tel[val]);
163
85
 
164
86
  val++;
165
87
  }
166
88
  fclose(fp);
167
89
  }
168
90
 
169
- void data_search()
91
+ void data_delete() {
170
- {
92
+ static char buff[N];
171
- FILE *fp;
93
+ FILE *fp;
172
- char word[10];
94
+ int len;
173
- int i=0;
95
+ int i=0;
174
- val=0;
96
+ val=0;
97
+
98
+ if(!(fp = fopen("data_tel.txt", "r"))){
99
+ printf("ファイルを開くことができません\n");
100
+ exit(1);
101
+ }
102
+ printf("削除する名前を検索します。検索する名前を入力して下さい。\n");
175
103
 
104
+ scanf("%s",buff);
105
+
106
+ while(fscanf(fp, "%s%s", names[val], tel[val])!=-1){
107
+ //fscanfでファイルを1行ずつ読み込む
108
+ // while( fscanf(fp,"%s,%s",&buf[0],&buf[1]) != EOF ){
176
- if(!(fp = fopen("data_tel", "r")))
109
+ // printf("%s,%s\n",buf[0],buf[1]);
110
+
111
+ if(strstr(names[val],buff) || strstr(tel[val],buff)){
112
+ //文字列namesの中から文字列buffを探しそのアドレスを返す。
113
+ //発見できなければNULL(\0)を返す。
114
+
115
+ printf("%-10s%5s\n",names[val],tel[val]);
177
- {
116
+ i=1;
117
+
118
+ len = strlen( &names[100][20]);
119
+ // 文字列namesの長さを返す。
120
+ // strlen関数は文字列の長さを「バイト数」で返します。
121
+ // namesの長さは20バイト, telの長さは20バイト,\0がついているので
122
+ // データ1行の長さは42バイト
123
+
178
- printf("ファイルを開くことができません\n");
124
+ printf( "len=%d\n" , len );
125
+
126
+
179
- exit(1);
127
+ //見つかると削除する(ここで削除したい)
180
- }
128
+ }
181
- printf("文字を検索します。検索する文字を入力して下さい。\n");
182
-
183
- printf("検索文字?(10文字まで)=");
184
-
185
- scanf("%s",word); // オリジナルは&wordになっていてエラーになる。
186
-
187
- while(fscanf(fp, "%s%s", names[val], tel[val])!=-1)
188
- {
189
- if(strstr(names[val],word) || strstr(tel[val],word))
190
- {
191
- printf("%-10s%5s\n",names[val],tel[val]);i=1;
192
- }
193
- }
194
- if(i==0)
195
- printf("該当データなし\n");
196
129
 
130
+ }
131
+ printf("削除された名前: %s\n", buff);
132
+ if(i==0)
133
+ printf("名前が見つかりません: %s\n", buff);
197
- fclose(fp);
134
+ fclose(fp);
135
+
136
+
198
137
  }
199
138
 
139
+ /*実行結果
140
+ naka@naka ~/kadai
200
- void data_delete() {
141
+ $ gcc -o data_delete1 data_delete1.c -Wall
201
-   static char buff[N];
202
-   FILE *fp;
203
-   int i=0;
204
-   val=0;
205
142
 
206
-   if(!(fp = fopen("data_tel", "r"))){
207
-   printf("ファイルを開くことができません\n");
143
+ naka@naka ~/kadai
208
-   exit(1);
144
+ $ data_delete1
209
-   }
210
-   printf("削除する名前を検索します。検索する名前を入力して下さい。\n");
145
+ 削除する名前を検索します。検索する名前を入力して下さい。
211
-    scanf("%s",buff);
146
+ kiyoko //関数scanfの表示
147
+ kiyoko 090-9999 //関数data_delete1の表示
148
+ len=4
149
+ 削除された名前: kiyoko
150
+ 名前番号 //関数data_show();の表示
151
+ -------------------------
152
+ naka 080-7777
153
+ kiyoko 090-9999
154
+ satou 090-3214
155
+ kinosita 080-8679
156
+ yamada 090-4325
212
157
 
213
-   while(fscanf(fp, "%s%s", names[val], tel[val])!=-1){
214
-   if(strstr(names[val],buff) || strstr(tel[val],buff){
215
-    printf("%-10s%5s\n",names[val],tel[val]);
216
-
217
-          //{見つかると削除するコード};
158
+ naka@naka ~/kadai
218
-  printf("削除された名前: %s\n", buff);
219
-   }
220
-   }
221
-   if(i==0)
159
+ */
222
- printf("名前が見つかりません: %s\n", buff);
160
+
223
-   fclose(fp);
224
-    data_show();
225
- }
226
161
 
227
- void data_amend() {
228
- static char buff[N];
229
- FILE *fp;
230
- int i=0;
231
- val=0;
232
162
 
233
- if(!(fp = fopen("data_tel", "r"))){
234
- printf("ファイルを開くことができません\n");
235
- exit(1);
236
- }
237
- printf("修正する名前と番号を検索します。検索する名前、番号を入力して下さい。\n");
238
-  
239
- scanf("%s",buff);
240
-
241
- while(fscanf(fp, "%s%s", names[val], tel[val])!=-1){
242
- if(strstr(names[val],buff) || strstr(tel[val],buff)){
243
- printf("%-10s%5s\n",names[val],tel[val]);
244
- i=1;
245
-
246
- //見つかると修正する
247
- for(val=0;val<MAX;val++){
248
- puts("変更しない場合は単に[return]を押して下さい");
249
- names[val]=buff;
250
- tel[val]=buff;
251
- }
252
- if(val>=MAX){
253
- printf("これ以上は入力できません。\n");
254
- }
255
- }
256
- if(i==0)
257
- printf("名前、番号が見つかりません: %s\n", buff);
258
- fclose(fp);
259
- data_show();
260
- }
261
- }
262
163
  ```