質問編集履歴

7

コードの変更

2018/01/06 05:49

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,16 +1,10 @@
1
- 実行結果がおかしいので、修正したいのですが、
2
-
3
- 色々やっているとき正常に削除されたのですが、保存しておけばよかったのですが残念です。
4
-
5
- 表示は以下の実行結果になります。
1
+ きました。皆さんあがとございます。
6
-
7
- lines2[0]=sachiko ,090-0809
2
+
8
-
9
-
10
-
11
- data_tmp.txtに1個だけコピーされいます。
3
+ 次にdata_tel.txtにdata_tmpをコピーこのdelete()
4
+
12
-
5
+ 関数を完成したいと思います。また
6
+
13
- 面倒ですが、ご教授ください。よろしくお願いいたします。
7
+ ご教授ください。よろしくお願いいたします。
14
8
 
15
9
  data_tel.txt
16
10
 
@@ -38,7 +32,7 @@
38
32
 
39
33
  コード
40
34
 
41
- // data_kirikae7.c
35
+ // data_kirikae8.c
42
36
 
43
37
  #include <stdio.h>
44
38
 
@@ -66,13 +60,13 @@
66
60
 
67
61
  FILE *fp1,*fp2 ;
68
62
 
69
- char line[Max][40]={0}; // 検索対象文字列を読み込む配列
63
+ char line[Max]={0}; // 検索対象文字列を読み込む配列
70
-
64
+
71
- char line2[Max][40]={0};
65
+ char line2[Max]={0};
72
66
 
73
67
  char buff[256]; //検索文字列
74
68
 
75
- int i=0,count=0;
69
+ int count=0;
76
70
 
77
71
  char *ptr;
78
72
 
@@ -86,7 +80,7 @@
86
80
 
87
81
  }
88
82
 
89
- if ((fp2 = fopen(dtfile2, "w")) == NULL) {
83
+ if ((fp2 = fopen(dtfile2, "r+")) == NULL) {
90
84
 
91
85
  fprintf(stderr, "ファイルのオープンに失敗しました.\n");
92
86
 
@@ -104,25 +98,23 @@
104
98
 
105
99
  //linesから1行ずつ取り出す。
106
100
 
107
- for(i=0; i<Max && fgets( line[i] , sizeof(line[i]) , fp1 ) != NULL;i++){
101
+ while(fgets(line, 256, fp1) != NULL){
108
-
102
+
109
- //printf( "lines[%d]=%s" , i,line[i] );
103
+ printf( "line=%s" ,line );
110
104
 
111
105
 
112
106
 
113
- ptr=strstr(line[i],buff);
107
+ ptr=strstr(line,buff);
114
108
 
115
109
  if(ptr){
116
110
 
117
- i++;
118
-
119
- fputs(line[i],fp2);
111
+ continue;
120
112
 
121
113
  }else{
122
114
 
123
115
  // 書き込み
124
116
 
125
- fputs(line[i],fp2);
117
+ fputs(line,fp2);
126
118
 
127
119
  count++;
128
120
 
@@ -142,11 +134,11 @@
142
134
 
143
135
  fp2 = fopen(dtfile2, "r");
144
136
 
145
- printf("\n");
137
+ printf("\n\n");
146
-
138
+
147
- for(i=0; i<Max && fgets( line2[i] , sizeof(line2[i]) , fp2 ) != NULL;i++){
139
+ while(fgets(line2, 256, fp2) != NULL){
148
-
140
+
149
- printf( "lines2[%d]=%s\n" , i,line2[i] );
141
+ printf( "line2=%s",line2);
150
142
 
151
143
  }
152
144
 
@@ -154,7 +146,7 @@
154
146
 
155
147
  fclose(fp2);
156
148
 
157
-
149
+ fclose(fp1);
158
150
 
159
151
 
160
152
 
@@ -162,25 +154,57 @@
162
154
 
163
155
 
164
156
 
165
- 【実行結果例】
157
+ /*【実行結果例】
166
-
158
+
167
- naka@naka ~/kadai/kadai9-8
159
+ naka@naka ~/kadai/kadai9-8
168
-
160
+
169
- $ gcc -o data_kakikae7 data_kakikae7.c -Wall
161
+ $ gcc -o data_kakikae8 data_kakikae8.c -Wall
170
-
171
-
172
-
162
+
163
+
164
+
173
- naka@naka ~/kadai/kadai9-8
165
+ naka@naka ~/kadai/kadai9-8
174
-
166
+
175
- $ data_kakikae7
167
+ $ data_kakikae8
176
168
 
177
169
  削除する名前を検索します。検索する名前を入力して下さい。
178
170
 
179
171
  naka
180
172
 
181
-
173
+ line=sachiko ,090-0809
174
+
182
-
175
+ line=naka ,090-7777
176
+
177
+ line=kiyoko ,090-9999
178
+
179
+ line=satou ,090-3214
180
+
181
+ line=kinosita ,090-8769
182
+
183
+ line=yamada ,090-4325
184
+
185
+ line=itou ,080-6354
186
+
187
+ line=sudou ,090-3333
188
+
189
+ line=kitou ,080-1342
190
+
191
+
192
+
183
- lines2[0]=sachiko ,090-0809
193
+ line2=sachiko ,090-0809
194
+
195
+ line2=kiyoko ,090-9999
196
+
197
+ line2=satou ,090-3214
198
+
199
+ line2=kinosita ,090-8769
200
+
201
+ line2=yamada ,090-4325
202
+
203
+ line2=itou ,080-6354
204
+
205
+ line2=sudou ,090-3333
206
+
207
+ line2=kitou ,080-1342
184
208
 
185
209
 
186
210
 
@@ -190,6 +214,12 @@
190
214
 
191
215
 
192
216
 
217
+ naka@naka ~/kadai/kadai9-8
218
+
219
+ $
220
+
221
+
222
+
193
223
 
194
224
 
195
225
 

6

実行結果と質問の修正

2018/01/06 05:49

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- 実行結果がおかしいので、修正したいのですが、どこが悪いのかわかりません。
1
+ 実行結果がおかしいので、修正したいのですが、
2
2
 
3
3
  色々やっているとき正常に削除されたのですが、保存しておけばよかったのですが残念です。
4
4
 
@@ -6,6 +6,8 @@
6
6
 
7
7
  lines2[0]=sachiko ,090-0809
8
8
 
9
+
10
+
9
11
  data_tmp.txtに1個だけコピーされています。
10
12
 
11
13
  面倒ですが、ご教授ください。よろしくお願いいたします。

5

実行結果とコードの修正

2018/01/06 04:34

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,6 @@
1
1
  実行結果がおかしいので、修正したいのですが、どこが悪いのかわかりません。
2
2
 
3
- 色々やっているとき正常に削除されたのですが、
3
+ 色々やっているとき正常に削除されたのですが、保存しておけばよかったのですが残念です。
4
4
 
5
5
  表示では以下の実行結果になります。
6
6
 
@@ -36,7 +36,7 @@
36
36
 
37
37
  コード
38
38
 
39
- // data_kirikae6.c
39
+ // data_kirikae7.c
40
40
 
41
41
  #include <stdio.h>
42
42
 
@@ -90,122 +90,108 @@
90
90
 
91
91
  return -1;
92
92
 
93
+ }
94
+
95
+ printf("削除する名前を検索します。検索する名前を入力して下さい。\n");
96
+
97
+
98
+
99
+ scanf("%s",buff);
100
+
101
+
102
+
103
+ //linesから1行ずつ取り出す。
104
+
105
+ for(i=0; i<Max && fgets( line[i] , sizeof(line[i]) , fp1 ) != NULL;i++){
106
+
107
+ //printf( "lines[%d]=%s" , i,line[i] );
108
+
109
+
110
+
111
+ ptr=strstr(line[i],buff);
112
+
113
+ if(ptr){
114
+
115
+ i++;
116
+
117
+ fputs(line[i],fp2);
118
+
119
+ }else{
120
+
121
+ // 書き込み
122
+
123
+ fputs(line[i],fp2);
124
+
125
+ count++;
126
+
127
+ if ( count < 0 ) {
128
+
129
+ count=fprintf(stderr, "ファイルの書込みに失敗しました.\n");
130
+
131
+ return -1;
132
+
133
+ }
134
+
93
135
  }
94
136
 
137
+ fclose(fp2);
138
+
139
+ }
140
+
95
- printf("削除する名前を検索します。検索する名前を入力して下さい。\n");
141
+ fp2 = fopen(dtfile2, "r");
96
-
97
-
98
-
142
+
99
- scanf("%s",buff);
143
+ printf("\n");
100
-
101
-
102
-
103
- //linesから1行ずつ取り出す。
144
+
104
-
105
- for(i=0; i<Max && fgets( line[i] , sizeof(line[i]) , fp1 ) != NULL;i++){
145
+ for(i=0; i<Max && fgets( line2[i] , sizeof(line2[i]) , fp2 ) != NULL;i++){
106
-
146
+
107
- printf( "%s" , line[i] );
147
+ printf( "lines2[%d]=%s\n" , i,line2[i] );
148
+
149
+ }
150
+
151
+ // ファイルクローズ
152
+
153
+ fclose(fp2);
108
154
 
109
155
 
110
156
 
111
- ptr=strstr(line[i],buff);
157
+
112
-
113
- if(ptr){
114
-
115
- i++;
116
-
117
- fputs(line[i],fp2);
118
-
119
- }else{
120
-
121
- // 書き込み
122
-
123
- fputs(line[i],fp2);
124
-
125
- count++;
126
-
127
- //printf("%d\n" , count);
128
-
129
- if ( count < 0 ) {
130
-
131
- fprintf(stderr, "ファイルの書込みに失敗しました.\n");
132
-
133
- return -1;
134
-
135
- }
136
-
137
- }
138
-
139
- // ファイルクローズ
140
-
141
- fclose(fp2);
142
-
143
- }
144
-
145
- fp2 = fopen(dtfile2, "r");
146
-
147
- printf("\n");
148
-
149
- for(i=0; i<Max && fgets( line2[i] , sizeof(line2[i]) , fp2 ) != NULL;i++){
150
-
151
- printf( "lines2[%d]=%s\n" , i,line2[i] );
152
-
153
- }
154
-
155
- //このあとdtfile2をdtfileにコピーする。
156
-
157
- // ファイルクローズ
158
-
159
- fclose(fp2);
160
-
161
- fclose(fp1);
162
158
 
163
159
  }
164
160
 
165
-
166
-
161
+
162
+
167
- 【実行結果】
163
+ 【実行結果
168
164
 
169
165
  naka@naka ~/kadai/kadai9-8
170
166
 
171
- $ gcc -o data_kakikae6 data_kakikae6.c -Wall
167
+ $ gcc -o data_kakikae7 data_kakikae7.c -Wall
172
168
 
173
169
 
174
170
 
175
171
  naka@naka ~/kadai/kadai9-8
176
172
 
177
- $ data_kakikae6
173
+ $ data_kakikae7
178
174
 
179
175
  削除する名前を検索します。検索する名前を入力して下さい。
180
176
 
181
177
  naka
182
178
 
183
- 削除する名前を検索します。検索する名前を入力して下さい。
179
+
184
-
185
- naka
186
-
187
- sachiko ,090-0809
188
-
189
- naka ,090-7777
190
-
191
- kiyoko ,090-9999
192
-
193
- satou ,090-3214
194
-
195
- kinosita ,090-8769
196
-
197
- yamada ,090-4325
198
-
199
- itou ,080-6354
200
-
201
- sudou ,090-3333
202
-
203
- kitou ,080-1342
204
180
 
205
181
  lines2[0]=sachiko ,090-0809
206
182
 
207
183
 
208
184
 
185
+ naka@naka ~/kadai/kadai9-8
186
+
187
+ $
188
+
189
+
190
+
191
+
192
+
193
+
194
+
209
195
 
210
196
 
211
197
 

4

質問と実行結果のへんこう

2018/01/06 04:21

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,8 +1,12 @@
1
1
  実行結果がおかしいので、修正したいのですが、どこが悪いのかわかりません。
2
2
 
3
+ 色々やっているとき正常に削除されたのですが、
4
+
3
- naka ,090-7777を削除したつもりが、表示では以下の実行結果になります。
5
+ 表示では以下の実行結果になります。
6
+
4
-
7
+ lines2[0]=sachiko ,090-0809
8
+
5
- data_tmp.txtはからぽでコピーされていません
9
+ data_tmp.txtに1個だけコピーされていま
6
10
 
7
11
  面倒ですが、ご教授ください。よろしくお願いいたします。
8
12
 
@@ -32,7 +36,7 @@
32
36
 
33
37
  コード
34
38
 
35
- // data_kirikae7.c
39
+ // data_kirikae6.c
36
40
 
37
41
  #include <stdio.h>
38
42
 
@@ -80,6 +84,14 @@
80
84
 
81
85
  }
82
86
 
87
+ if ((fp2 = fopen(dtfile2, "w")) == NULL) {
88
+
89
+ fprintf(stderr, "ファイルのオープンに失敗しました.\n");
90
+
91
+ return -1;
92
+
93
+ }
94
+
83
95
  printf("削除する名前を検索します。検索する名前を入力して下さい。\n");
84
96
 
85
97
 
@@ -92,45 +104,47 @@
92
104
 
93
105
  for(i=0; i<Max && fgets( line[i] , sizeof(line[i]) , fp1 ) != NULL;i++){
94
106
 
95
- //printf( "lines[%d]=%s" , i,line[i] );
107
+ printf( "%s" , line[i] );
96
108
 
97
109
 
98
110
 
111
+ ptr=strstr(line[i],buff);
112
+
113
+ if(ptr){
114
+
115
+ i++;
116
+
117
+ fputs(line[i],fp2);
118
+
119
+ }else{
120
+
121
+ // 書き込み
122
+
123
+ fputs(line[i],fp2);
124
+
125
+ count++;
126
+
99
- if ((fp2 = fopen(dtfile2, "w")) == NULL) {
127
+ //printf("%d\n" , count);
128
+
100
-
129
+ if ( count < 0 ) {
130
+
101
- fprintf(stderr, "ファイルのオープンに失敗しました\n");
131
+ fprintf(stderr, "ファイルの書込みに失敗しました.\n");
102
-
132
+
103
- return -1;
133
+ return -1;
134
+
135
+ }
104
136
 
105
137
  }
106
138
 
107
- ptr=strstr(line[i],buff);
108
-
109
- if(ptr){
110
-
111
- ptr++;
112
-
113
- fputs(line[i],fp2);
114
-
115
- }else{
116
-
117
- // 書き込み
139
+ // ファイルクローズ
118
-
140
+
119
- fputs(line[i],fp2);
141
+ fclose(fp2);
120
-
121
- if ( count < 0 ) {
122
-
123
- count=fprintf(stderr, "ファイルの書込みに失敗しました.\n");
124
-
125
- return -1;
126
-
127
- }
128
-
129
- }
130
142
 
131
143
  }
132
144
 
145
+ fp2 = fopen(dtfile2, "r");
146
+
133
- printf("\n");
147
+ printf("\n");
134
148
 
135
149
  for(i=0; i<Max && fgets( line2[i] , sizeof(line2[i]) , fp2 ) != NULL;i++){
136
150
 
@@ -138,61 +152,59 @@
138
152
 
139
153
  }
140
154
 
155
+ //このあとdtfile2をdtfileにコピーする。
156
+
141
- // ファイルクローズ
157
+ // ファイルクローズ
142
158
 
143
159
  fclose(fp2);
144
160
 
145
-
161
+ fclose(fp1);
146
-
147
-
148
162
 
149
163
  }
150
164
 
151
-
165
+
152
166
 
153
167
  【実行結果】
154
168
 
155
169
  naka@naka ~/kadai/kadai9-8
156
170
 
157
- $ gcc -o data_kakikae7 data_kakikae7.c -Wall
171
+ $ gcc -o data_kakikae6 data_kakikae6.c -Wall
158
172
 
159
173
 
160
174
 
161
175
  naka@naka ~/kadai/kadai9-8
162
176
 
163
- $ data_kakikae7
177
+ $ data_kakikae6
164
178
 
165
179
  削除する名前を検索します。検索する名前を入力して下さい。
166
180
 
167
181
  naka
168
182
 
183
+ 削除する名前を検索します。検索する名前を入力して下さい。
184
+
169
185
  naka
170
186
 
171
-
172
-
173
- lines2[0]=
187
+ sachiko ,090-0809
188
+
174
-
189
+ naka ,090-7777
190
+
175
- lines2[1]=
191
+ kiyoko ,090-9999
176
-
192
+
177
- lines2[2]=
193
+ satou ,090-3214
178
-
179
-
180
-
181
- .....省略
194
+
182
-
183
-
184
-
185
- lines2[97]=
195
+ kinosita ,090-8769
196
+
186
-
197
+ yamada ,090-4325
198
+
199
+ itou ,080-6354
200
+
201
+ sudou ,090-3333
202
+
203
+ kitou ,080-1342
204
+
187
- lines2[98]=
205
+ lines2[0]=sachiko ,090-0809
188
-
189
- lines2[99]=
206
+
190
-
191
-
192
-
193
- naka@naka ~/kadai/kadai9-8
207
+
194
-
195
- $
196
208
 
197
209
 
198
210
 

3

新しいコードと質問変更

2018/01/06 04:08

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,28 +1,10 @@
1
1
  実行結果がおかしいので、修正したいのですが、どこが悪いのかわかりません。
2
2
 
3
- 面倒ですが、ご教授ください。
4
-
5
- 1.実際のdata_tel.txtのnaka ,090-7777削除されてい
3
+ naka ,090-7777削除したつもりが、表示では以下の実行結果にります
6
-
4
+
7
-  実行結果の端末は錯書されていま
5
+ data_tmp.txtはからぽコピーされていません
8
-
9
- 2.名前のアドレス:00408080
6
+
10
-
11
-   名前のアドレス:00408080 が2回表示される。1回にしたい。
12
-
13
- 3.名前のアドレス:00408080(sp1)と見つかった名前のアドレス:00408080
14
-
15
-   おなじである。実際はポインタが1個進んでいるはずですが、進んでないか、
16
-
17
-   sp1がおかしいかと思います。
18
-
19
- 4.アドレスがチャンとしていれば、見つかった位置は1番目になるはずです。
20
-
21
-
22
-
23
- 5.名前が見つかりません: nakaと表示される。
24
-
25
- 以上です。よろしくお願いいたします。
7
+ 面倒ですが、ご教授ください。よろしくお願いいたします。
26
8
 
27
9
  data_tel.txt
28
10
 
@@ -50,7 +32,7 @@
50
32
 
51
33
  コード
52
34
 
53
- // data_kirikae6.c
35
+ // data_kirikae7.c
54
36
 
55
37
  #include <stdio.h>
56
38
 
@@ -62,7 +44,7 @@
62
44
 
63
45
 
64
46
 
65
- #define MAX 100
47
+ #define Max 100
66
48
 
67
49
 
68
50
 
@@ -70,14 +52,6 @@
70
52
 
71
53
  char dtfile2[]="data_tmp.txt";
72
54
 
73
- char names[MAX][20]; // MAX100人、20文字
74
-
75
- char tel[MAX][20]; // MAX100人、20文字
76
-
77
-
78
-
79
- long getFileSize(char *dtfile);
80
-
81
55
 
82
56
 
83
57
  int main(void)
@@ -86,31 +60,23 @@
86
60
 
87
61
  FILE *fp1,*fp2 ;
88
62
 
89
- char line[256]={0}; // 検索対象文字列を読み込む配列
63
+ char line[Max][40]={0}; // 検索対象文字列を読み込む配列
64
+
90
-
65
+ char line2[Max][40]={0};
66
+
91
- char buff[256]; //検索文字列
67
+ char buff[256]; //検索文字列
68
+
69
+ int i=0,count=0;
70
+
71
+ char *ptr;
92
72
 
93
73
 
94
74
 
95
- char *sp1,*sp2;
96
-
97
-
98
-
99
- int i=0;
100
-
101
- int val=0; // 名前と番号の配列番号
102
-
103
- long file_size;
104
-
105
- char * ptr=NULL;
106
-
107
-
108
-
109
- if(!(fp1 = fopen(dtfile, "r"))){
75
+ if(!(fp1 = fopen(dtfile, "r"))){
110
76
 
111
77
  printf("ファイルを開くことができません\n");
112
78
 
113
- exit(1);
79
+ return -1;
114
80
 
115
81
  }
116
82
 
@@ -120,217 +86,107 @@
120
86
 
121
87
  scanf("%s",buff);
122
88
 
89
+
90
+
123
-
91
+ //linesから1行ずつ取り出す。
124
-
92
+
125
- while(fscanf(fp1, "%s%s", names[val], tel[val])!=-1){
93
+ for(i=0; i<Max && fgets( line[i] , sizeof(line[i]) , fp1 ) != NULL;i++){
126
-
127
- sp1=names[0];
94
+
128
-
129
- printf("名前のアドレス:%-10p\n",sp1);
95
+ //printf( "lines[%d]=%s" , i,line[i] );
130
-
96
+
97
+
98
+
131
- if(strstr(names[val],buff) || strstr(tel[val],buff)){
99
+ if ((fp2 = fopen(dtfile2, "w")) == NULL) {
132
-
100
+
133
- printf("\n名前が見つかりました\n");
101
+ fprintf(stderr, "ファイルのオープンに失敗しました\n");
134
-
135
-
136
-
102
+
137
- printf("%-10s%5s\n",names[val],tel[val]);
103
+ return -1;
104
+
138
-
105
+ }
139
-
140
-
106
+
141
- sp2=strstr(names[val],buff);
107
+ ptr=strstr(line[i],buff);
142
-
143
- printf("見つかった名前のアドレス:%-10p\n",sp2);
108
+
144
-
145
-
146
-
147
- i=sp2-sp1;
109
+ if(ptr){
148
-
110
+
149
- printf("%d番目です\n",i);
111
+ ptr++;
150
-
151
-
152
-
112
+
153
- file_size=getFileSize(dtfile);
113
+ fputs(line[i],fp2);
154
-
155
-
156
-
114
+
157
- printf("%sのサイズ: %ld\n", dtfile, file_size);
115
+ }else{
158
-
159
-
160
-
116
+
161
- //mallocでメモリを確保する
117
+ // 書き込み
162
-
118
+
163
- ptr = (char *)malloc(file_size);
119
+ fputs(line[i],fp2);
164
-
165
-
166
-
120
+
167
- if (ptr == NULL)
121
+ if ( count < 0 ) {
168
-
169
- {
122
+
170
-
171
- printf("malloc()に失敗しました\n");
123
+ count=fprintf(stderr, "ファイルの書込みに失敗しました.\n");
172
124
 
173
125
  return -1;
174
126
 
175
- }
176
-
177
- printf("確保したメモリブロックのアドレス: %p\n", ptr);
178
-
179
-
180
-
181
- fp2= fopen(dtfile2, "w");
182
-
183
-
184
-
185
- //buffが配列の何番目かを見つける
186
-
187
- //i番目の場合,i-1までdata_tmp.txtに書き込む
188
-
189
- fprintf(fp2, "%s", line-1);
190
-
191
- fclose(fp2);
192
-
193
-
194
-
195
- //読み込んだdata_tel.txtの次のデータを
196
-
197
- //data_tmp.txtにn+1から末尾まで追加書き込みする。
198
-
199
- fp2= fopen(dtfile2, "a");
200
-
201
- fprintf(fp2, "%s", line+1);
202
-
203
- fclose(fp2);
204
-
205
- //data_tmp.txtをdata_tel.txtにコピーする。
206
-
207
- fp2= fopen(dtfile2, "w");
208
-
209
- strcpy(dtfile, dtfile2);
210
-
211
- //data_tel.txtを表示する。
212
-
213
- while (fgets(line, 256, fp1)!=NULL){
214
-
215
- printf("%s", line);
216
-
217
127
  }
218
128
 
219
- printf("\n");
220
-
221
- }
129
+ }
222
-
223
-
224
130
 
225
131
  }
226
132
 
133
+ printf("\n");
134
+
135
+ for(i=0; i<Max && fgets( line2[i] , sizeof(line2[i]) , fp2 ) != NULL;i++){
136
+
227
- printf("削除された名前: %s\n", buff);
137
+ printf( "lines2[%d]=%s\n" , i,line2[i] );
138
+
228
-
139
+ }
140
+
229
- if(i==0) printf("名前が見つかりません: %s\n", buff);
141
+ // ファイルクローズ
230
-
231
-
232
-
142
+
233
- fclose(fp2);
143
+ fclose(fp2);
234
-
235
- fclose(fp1);
144
+
236
-
237
-
145
+
146
+
147
+
238
148
 
239
149
  }
240
150
 
241
151
 
242
152
 
243
- long getFileSize(char *dtfile)
244
-
245
- {
246
-
247
- struct stat statBuf;
248
-
249
- int file_size;
250
-
251
-
252
-
253
- if (stat(dtfile, &statBuf) == 0)
254
-
255
- // ファイルfileからファイル情報を取得し、
256
-
257
- // stat構造体変数statBuf)に格納する。
258
-
259
-
260
-
261
- file_size = (int)(statBuf.st_size); // サイズを取得
262
-
263
- printf("size: %d(バイト)\n",file_size); // 表示
264
-
265
-
266
-
267
- return statBuf.st_size;
268
-
269
- // off_t st_size; // 全体のサイズ (バイト単位)
270
-
271
-
272
-
273
- return -1L;
274
-
275
- }
276
-
277
-
278
-
279
153
  【実行結果】
280
154
 
281
155
  naka@naka ~/kadai/kadai9-8
282
156
 
283
- $ gcc -o data_kakikae5 data_kakikae5.c -Wall
157
+ $ gcc -o data_kakikae7 data_kakikae7.c -Wall
284
158
 
285
159
 
286
160
 
287
161
  naka@naka ~/kadai/kadai9-8
288
162
 
289
- $ data_kakikae5
163
+ $ data_kakikae7
290
164
 
291
165
  削除する名前を検索します。検索する名前を入力して下さい。
292
166
 
293
167
  naka
294
168
 
295
- 名前のアドレス:00408080
169
+ naka
296
-
297
- 名前のアドレス:00408080
170
+
298
-
299
-
300
-
171
+
172
+
301
- 名前が見つかりました
173
+ lines2[0]=
302
-
174
+
303
- naka ,090-7777
175
+ lines2[1]=
304
-
176
+
305
- 見つかった名前のアドレス:00408080
177
+ lines2[2]=
306
-
178
+
179
+
180
+
307
- 0番目です
181
+ .....省略
308
-
182
+
183
+
184
+
309
- size: 196(バイト)
185
+ lines2[97]=
310
-
311
- data_tel.txtのサイズ: 196
186
+
312
-
313
- 確保したメモリブロックのアドレス: 02712A50
314
-
315
-
316
-
317
- kiyoko ,090-9999
318
-
319
- satou ,090-3214
320
-
321
- kinosita ,090-8769
187
+ lines2[98]=
322
-
323
- yamada ,090-4325
188
+
324
-
325
- itou ,080-6354
326
-
327
- sudou ,090-3333
328
-
329
- kitou ,080-1342
330
-
331
- 削除された名前: naka
189
+ lines2[99]=
332
-
333
- 名前が見つかりません: naka
334
190
 
335
191
 
336
192
 
@@ -344,4 +200,6 @@
344
200
 
345
201
 
346
202
 
203
+
204
+
347
205
  ```

2

質問の変更,コードの差し替え

2018/01/06 02:50

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,18 +1,28 @@
1
- teratailご教授頂た指針やっていますが先に
1
+ 実行結果がおかしいの、修正したすが、どこが悪のかわかりせん。
2
+
2
-
3
+ 面倒ですが、ご教授ください。
4
+
5
+ 1.実際のdata_tel.txtのnaka ,090-7777が削除されていない。
6
+
3
- 進まないのでよろしくお願いたします。
7
+  実行結果端末は錯書されています。
4
-
8
+
5
- 一時ファイルハンルを得るところまで来ていますが、
9
+ 2.名前レス:00408080
6
-
7
- 引数がこんがらがって良くわかりません。わたしのコードに合わせて
10
+
8
-
9
- 修正してほしいのですが、修正の範囲はコードに示しています。
10
-
11
- 削除したい名前の先頭アドレスまでわかっていますfwrite()の引数が1つ不足ます
11
+   名前のアドレス:00408080 が2回表示される。1回にい。
12
+
12
-
13
+ 3.名前のアドレス:00408080(sp1)と見つかった名前のアドレス:00408080
14
+
15
+   おなじである。実際はポインタが1個進んでいるはずですが、進んでないか、
16
+
13
- できればfputs()を使ので
17
+   sp1がおかしかと思す。
18
+
14
-
19
+ 4.アドレスがチャンとしていれば、見つかった位置は1番目になるはずです。
20
+
21
+
22
+
23
+ 5.名前が見つかりません: nakaと表示される。
24
+
15
- よろしくお願いいたします。
25
+ 以上です。よろしくお願いいたします。
16
26
 
17
27
  data_tel.txt
18
28
 
@@ -40,7 +50,7 @@
40
50
 
41
51
  コード
42
52
 
43
- // data_kirikae5.c
53
+ // data_kirikae6.c
44
54
 
45
55
  #include <stdio.h>
46
56
 
@@ -58,6 +68,8 @@
58
68
 
59
69
  char dtfile[]="data_tel.txt";
60
70
 
71
+ char dtfile2[]="data_tmp.txt";
72
+
61
73
  char names[MAX][20]; // MAX100人、20文字
62
74
 
63
75
  char tel[MAX][20]; // MAX100人、20文字
@@ -74,13 +86,15 @@
74
86
 
75
87
  FILE *fp1,*fp2 ;
76
88
 
77
- //char* search_str={0}; //検索文字列
89
+ char line[256]={0}; // 検索対象文字列を読み込む配列
78
-
90
+
79
- static char buff[256]; // 検索対象文字列
91
+ char buff[256]; //検索文字列
80
-
92
+
93
+
94
+
81
- char* sp;
95
+ char *sp1,*sp2;
82
-
83
- int len,name_len,tel_len;
96
+
97
+
84
98
 
85
99
  int i=0;
86
100
 
@@ -88,7 +102,7 @@
88
102
 
89
103
  long file_size;
90
104
 
91
- char * ptr;
105
+ char * ptr=NULL;
92
106
 
93
107
 
94
108
 
@@ -110,37 +124,33 @@
110
124
 
111
125
  while(fscanf(fp1, "%s%s", names[val], tel[val])!=-1){
112
126
 
127
+ sp1=names[0];
128
+
129
+ printf("名前のアドレス:%-10p\n",sp1);
130
+
113
131
  if(strstr(names[val],buff) || strstr(tel[val],buff)){
114
132
 
115
133
  printf("\n名前が見つかりました\n");
116
134
 
135
+
136
+
117
137
  printf("%-10s%5s\n",names[val],tel[val]);
118
138
 
119
- sp=strstr(names[val],buff);
120
-
121
- printf("見つかった名前のアドレス:%-10p\n",sp);
122
-
123
- i=1;
124
-
125
139
 
126
140
 
127
- name_len=strlen( names[0]);
141
+ sp2=strstr(names[val],buff);
128
-
142
+
129
- tel_len =strlen( tel[0]);
143
+ printf("見つかった名前のアドレス:%-10p\n",sp2);
130
-
144
+
145
+
146
+
131
- len = 10+tel_len+1;
147
+ i=sp2-sp1;
132
-
133
-
134
-
148
+
135
- printf( "len=%d\n" , len );
149
+ printf("%d番目です\n",i);
136
-
137
- printf( "name_len=%d\n" , name_len );
150
+
138
-
139
- printf( "tel_len=%d\n" , tel_len );
151
+
140
-
141
-
142
-
152
+
143
- file_size=getFileSize(dtfile);
153
+ file_size=getFileSize(dtfile);
144
154
 
145
155
 
146
156
 
@@ -150,7 +160,7 @@
150
160
 
151
161
  //mallocでメモリを確保する
152
162
 
153
- ptr = ( char * )malloc(file_size);
163
+ ptr = (char *)malloc(file_size);
154
164
 
155
165
 
156
166
 
@@ -168,27 +178,53 @@
168
178
 
169
179
 
170
180
 
171
- //ここから修正したい(ここで削除したい)上のコードに合わせて書き換えたい
172
-
173
- fp2= fopen(dtfile, "wb");
181
+ fp2= fopen(dtfile2, "w");
182
+
183
+
184
+
174
-
185
+ //buffが配列の何番目かを見つける
186
+
175
-
187
+ //i番目の場合,i-1までdata_tmp.txtに書き込む
188
+
176
-
189
+ fprintf(fp2, "%s", line-1);
190
+
191
+ fclose(fp2);
192
+
193
+
194
+
195
+ //読み込んだdata_tel.txtの次のデータを
196
+
197
+ //data_tmp.txtにn+1から末尾まで追加書き込みする。
198
+
199
+ fp2= fopen(dtfile2, "a");
200
+
201
+ fprintf(fp2, "%s", line+1);
202
+
203
+ fclose(fp2);
204
+
205
+ //data_tmp.txtをdata_tel.txtにコピーする。
206
+
207
+ fp2= fopen(dtfile2, "w");
208
+
209
+ strcpy(dtfile, dtfile2);
210
+
211
+ //data_tel.txtを表示する。
212
+
177
- const char* delete_str_front = NULL;
213
+ while (fgets(line, 256, fp1)!=NULL){
178
-
179
- for(const char* p = input_str;NULL != (delete_str_front = strstr(input_str, search_str)); p = delete_str_front + search_str_len){
214
+
180
-
181
- fwrite(tmp_file_handle, p, delete_str_front - p);
215
+ printf("%s", line);
182
-
216
+
183
- }
217
+ }
218
+
184
-
219
+ printf("\n");
220
+
185
- }
221
+ }
186
-
187
- //ここまでを修正したい
222
+
188
-
223
+
224
+
189
- }
225
+ }
190
-
226
+
191
- //printf("削除された名前: %s\n", buff);
227
+ printf("削除された名前: %s\n", buff);
192
228
 
193
229
  if(i==0) printf("名前が見つかりません: %s\n", buff);
194
230
 
@@ -240,41 +276,69 @@
240
276
 
241
277
 
242
278
 
243
- 【実行結果
279
+ 【実行結果】
244
280
 
245
281
  naka@naka ~/kadai/kadai9-8
246
282
 
247
- $ gcc -o data_kakikae3 data_kakikae3.c -Wall
283
+ $ gcc -o data_kakikae5 data_kakikae5.c -Wall
248
284
 
249
285
 
250
286
 
251
287
  naka@naka ~/kadai/kadai9-8
252
288
 
253
- $ data_kakikae3
289
+ $ data_kakikae5
254
290
 
255
291
  削除する名前を検索します。検索する名前を入力して下さい。
256
292
 
257
293
  naka
258
294
 
295
+ 名前のアドレス:00408080
296
+
297
+ 名前のアドレス:00408080
298
+
259
299
 
260
300
 
261
301
  名前が見つかりました
262
302
 
263
303
  naka ,090-7777
264
304
 
265
- 見つかった名前のアドレス:00407180
305
+ 見つかった名前のアドレス:00408080
266
-
306
+
267
- len=20
307
+ 0番目です
268
-
269
- name_len=4
308
+
270
-
271
- tel_len=9
272
-
273
- size: 198(バイト)
309
+ size: 196(バイト)
274
-
310
+
275
- data_tel.txtのサイズ: 198
311
+ data_tel.txtのサイズ: 196
276
-
312
+
277
- 確保したメモリブロックのアドレス: 026E2A50
313
+ 確保したメモリブロックのアドレス: 02712A50
314
+
315
+
316
+
317
+ kiyoko ,090-9999
318
+
319
+ satou ,090-3214
320
+
321
+ kinosita ,090-8769
322
+
323
+ yamada ,090-4325
324
+
325
+ itou ,080-6354
326
+
327
+ sudou ,090-3333
328
+
329
+ kitou ,080-1342
330
+
331
+ 削除された名前: naka
332
+
333
+ 名前が見つかりません: naka
334
+
335
+
336
+
337
+ naka@naka ~/kadai/kadai9-8
338
+
339
+ $
340
+
341
+
278
342
 
279
343
 
280
344
 

1

コードの差し替えと、質問の訂正

2018/01/05 16:35

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -2,496 +2,282 @@
2
2
 
3
3
  進まないのでよろしくお願いいたします。
4
4
 
5
- ファイルに書き出して元ファイ削除しリネームとう手法になる。
6
-
7
- ファイル削除はremove、ファイル名変更はrenameを使う
8
-
9
- 1.現状のコード同様文字列検索
10
-
11
- data_tel_delete1.cでクリア
12
-
13
-
14
-
15
- 2. 一つでも見つかっらfstatでファイルサイズを求める
16
-
17
- getfileSize(data_tel)でクリア,198バイト
18
-
19
-
20
-
21
- 3. ファイルサイズ分のメモリーを確保
22
-
23
- ファイルサイズ198バイト分のメモリを確保する。
24
-
25
-
26
-
27
-  char *ptr;
28
-
29
-  ptr=(char*)malloc(size); クリア
30
-
31
-  
32
-
33
-  getfileSize(data_tel)でクリア
34
-
35
-
36
-
37
- 4.fseekでファイル先頭に戻り、mallocで確保したメモリ(ptr)へ
38
-
39
- 読み込み。 一時ファイルのハンドルを得る
40
-
41
- delete_seek.cでクリア
5
+ 一時ファイルのハンドを得るところまで来ていますが、
6
+
7
+ 引数がこんがらがって良くわかりませんわたしのコードに合わせて
8
+
9
+ 修正してほしいですが、修正の範囲はコードに示しています。
10
+
11
+ 削除したい名前の先頭アドレスまでわかっています。fwrite()の引数が1つ不足しています。
12
+
13
+ できればfputs()を使いたいのですが。
14
+
15
+ よろしくお願いいします。
16
+
17
+ data_tel.txt
18
+
19
+ sachiko ,090-0809
20
+
21
+ naka ,090-7777
22
+
23
+ kiyoko ,090-9999
24
+
25
+ satou ,090-3214
26
+
27
+ kinosita ,090-8769
28
+
29
+ yamada ,090-4325
30
+
31
+ itou ,080-6354
32
+
33
+ sudou ,090-3333
34
+
35
+ kitou ,080-13424
36
+
37
+
38
+
39
+ ```
40
+
41
+ コード
42
+
43
+ // data_kirikae5.c
44
+
45
+ #include <stdio.h>
46
+
47
+ #include <string.h>
48
+
49
+ #include <stdlib.h> //for exit
50
+
51
+ #include <sys\stat.h>
52
+
53
+
54
+
55
+ #define MAX 100
56
+
57
+
58
+
59
+ char dtfile[]="data_tel.txt";
60
+
61
+ char names[MAX][20]; // MAX100人、20文字
62
+
63
+ char tel[MAX][20]; // MAX100人、20文字
64
+
65
+
66
+
67
+ long getFileSize(char *dtfile);
68
+
69
+
70
+
71
+ int main(void)
72
+
73
+ {
74
+
75
+ FILE *fp1,*fp2 ;
76
+
77
+ //char* search_str={0}; //検索文字列
78
+
79
+ static char buff[256]; // 検索対象文字列
80
+
81
+ char* sp;
82
+
83
+ int len,name_len,tel_len;
84
+
85
+ int i=0;
86
+
87
+ int val=0; // 名前と番号の配列番号
88
+
89
+ long file_size;
90
+
91
+ char * ptr;
92
+
93
+
94
+
95
+ if(!(fp1 = fopen(dtfile, "r"))){
96
+
97
+ printf("ファイルを開くことができません\n");
98
+
99
+ exit(1);
100
+
101
+ }
102
+
103
+ printf("削除する名前を検索します。検索する名前を入力して下さい。\n");
104
+
105
+
106
+
107
+ scanf("%s",buff);
108
+
109
+
110
+
111
+ while(fscanf(fp1, "%s%s", names[val], tel[val])!=-1){
112
+
113
+ if(strstr(names[val],buff) || strstr(tel[val],buff)){
114
+
115
+ printf("\n名前が見つかりました\n");
116
+
117
+ printf("%-10s%5s\n",names[val],tel[val]);
118
+
119
+ sp=strstr(names[val],buff);
120
+
121
+ printf("見つかった名前のアドレス:%-10p\n",sp);
122
+
123
+ i=1;
124
+
125
+
126
+
127
+ name_len=strlen( names[0]);
128
+
129
+ tel_len =strlen( tel[0]);
130
+
131
+ len = 10+tel_len+1;
132
+
133
+
134
+
135
+ printf( "len=%d\n" , len );
136
+
137
+ printf( "name_len=%d\n" , name_len );
138
+
139
+ printf( "tel_len=%d\n" , tel_len );
140
+
141
+
142
+
143
+ file_size=getFileSize(dtfile);
144
+
145
+
146
+
147
+ printf("%sのサイズ: %ld\n", dtfile, file_size);
42
148
 
43
149
 
44
150
 
45
- 5.strstr駆使しながら削除部分以外を一時ファイルに
46
-
47
- fputs()関数で書き込んでいきたい。クリアできていないです。
48
-
49
-   ここから少し具体的な指針をお願い致します。
50
-
51
-     data_tel.txtの2番目の naka ,090-7777を削除する。
52
-
53
-     naka の先頭アドレスを求めてその前の
54
-
55
-     最初のsachiko ,090-0809をtmpファイルコピーする
56
-
57
-     そのあと後kiyoko ,090-9999の先頭アドレスに移動して
58
-
59
-     そこからあとを一時ファイルに追加する。
60
-
61
-     一時ファイルを元data_tel.txtにコピーする。
62
-
63
-     remove、renameを使いたいのですが。
64
-
65
- よろくお願いいたします。
66
-
67
- data_tel.txt
68
-
69
- sachiko ,090-0809
70
-
71
- naka ,090-7777
72
-
73
- kiyoko ,090-9999
74
-
75
- satou ,090-3214
76
-
77
- kinosita ,090-8769
78
-
79
- yamada ,090-4325
80
-
81
- itou ,080-6354
82
-
83
- sudou ,090-3333
84
-
85
- kitou ,080-13424
151
+ //mallocでメモリ確保する
152
+
153
+ ptr = ( char * )malloc(file_size);
154
+
155
+
156
+
157
+ if (ptr == NULL)
158
+
159
+ {
160
+
161
+ printf("malloc()失敗しました\n");
162
+
163
+ return -1;
164
+
165
+ }
166
+
167
+ printf("確保したメモリブロックアドレス: %p\n", ptr);
168
+
169
+
170
+
171
+ //ここから修正(ここで削除した)上のコードに合わせて書き換え
172
+
173
+ fp2= fopen(dtfile, "wb");
174
+
175
+
176
+
177
+ const char* delete_str_front = NULL;
178
+
179
+ for(const char* p = input_str;NULL != (delete_str_front = strstr(input_str, search_str)); p = delete_str_front + search_str_len){
180
+
181
+ fwrite(tmp_file_handle, p, delete_str_front - p);
182
+
183
+ }
184
+
185
+ }
186
+
187
+ //ここまでを修正したい
188
+
189
+ }
190
+
191
+ //printf("削除された名前: %s\n", buff);
192
+
193
+ if(i==0) printf("名前が見つかりません: %s\n", buff);
194
+
195
+
196
+
197
+ fclose(fp2);
198
+
199
+ fclose(fp1);
200
+
201
+
202
+
203
+ }
204
+
205
+
206
+
207
+ long getFileSize(char *dtfile)
208
+
209
+ {
210
+
211
+ struct stat statBuf;
212
+
213
+ int file_size;
214
+
215
+
216
+
217
+ if (stat(dtfile, &statBuf) == 0)
218
+
219
+ // ファイルfileからファイル情報を取得し、
220
+
221
+ // stat構造体変数statBuf)に格納する。
222
+
223
+
224
+
225
+ file_size = (int)(statBuf.st_size); // サイズを取得
226
+
227
+ printf("size: %d(バイト)\n",file_size); // 表示
228
+
229
+
230
+
231
+ return statBuf.st_size;
232
+
233
+ // off_t st_size; // 全体のサイズ (バイト単位)
234
+
235
+
236
+
237
+ return -1L;
238
+
239
+ }
240
+
241
+
242
+
243
+ 【実行結果例】
244
+
245
+ naka@naka ~/kadai/kadai9-8
246
+
247
+ $ gcc -o data_kakikae3 data_kakikae3.c -Wall
248
+
249
+
250
+
251
+ naka@naka ~/kadai/kadai9-8
252
+
253
+ $ data_kakikae3
254
+
255
+ 削除する名前を検索します。検索する名前を入力して下さい。
256
+
257
+ naka
258
+
259
+
260
+
261
+ 名前が見つかりました
262
+
263
+ naka ,090-7777
264
+
265
+ 見つかった名前のアドレス:00407180
266
+
267
+ len=20
268
+
269
+ name_len=4
270
+
271
+ tel_len=9
272
+
273
+ size: 198(バイト)
274
+
275
+ data_tel.txtのサイズ: 198
276
+
277
+ 確保したメモリブロックのアドレス: 026E2A50
278
+
279
+
86
280
 
87
281
 
88
282
 
89
283
  ```
90
-
91
- コード
92
-
93
- #include<stdio.h>
94
-
95
- #include<string.h> //for strcmp,strstr
96
-
97
- #include<stdlib.h> //for exit
98
-
99
- #include <fcntl.h>
100
-
101
- #include <sys/stat.h>
102
-
103
- #include <sys/types.h>
104
-
105
- #include <unistd.h>
106
-
107
- #include <ctype.h>
108
-
109
-
110
-
111
- #define N 256
112
-
113
- #define MAX 100 // MAX100人
114
-
115
- #define ERR_PRINTF_EXIT(...) do { fprintf(stderr, __VA_ARGS__); exit(EXIT_FAILURE); } while(0)
116
-
117
-
118
-
119
- char dtfile[]="data_tel.txt";
120
-
121
-
122
-
123
- char names[MAX][20]; // MAX100人、20文字
124
-
125
- char tel[MAX][20]; // MAX100人、20文字
126
-
127
- int val; // 名前と番号の配列番号
128
-
129
-
130
-
131
- void data_show(); // データ表示
132
-
133
- void data_delete();
134
-
135
-
136
-
137
- static long getFileSize(const char *dtfile)
138
-
139
- {
140
-
141
- FILE *fp;
142
-
143
- long file_size;
144
-
145
- struct stat stbuf;
146
-
147
- int fd;
148
-
149
-
150
-
151
- fd=open(dtfile, O_RDONLY);
152
-
153
-
154
-
155
- if (fd == -1)
156
-
157
- ERR_PRINTF_EXIT("cant open file : %s.\n", dtfile);
158
-
159
-
160
-
161
- fp = fdopen(fd, "rb");
162
-
163
- if (fp == NULL)
164
-
165
- ERR_PRINTF_EXIT("cant open file : %s.\n", dtfile);
166
-
167
-
168
-
169
- if (fstat(fd, &stbuf) == -1)
170
-
171
- // fstat() は、正常終了時には 0 を戻します。
172
-
173
-
174
-
175
- ERR_PRINTF_EXIT("cant get file state : %s.\n", dtfile);
176
-
177
-
178
-
179
- file_size = stbuf.st_size;
180
-
181
-
182
-
183
- if (fclose(fp) != 0)
184
-
185
- ERR_PRINTF_EXIT("cant close file : %s.\n", dtfile);
186
-
187
-
188
-
189
- return file_size;
190
-
191
- }
192
-
193
-
194
-
195
- int main()
196
-
197
- {
198
-
199
- FILE *fp;
200
-
201
- long file_size=0;
202
-
203
- char *ptr;
204
-
205
- char buff[1000];
206
-
207
-
208
-
209
- file_size=getFileSize(dtfile);
210
-
211
-
212
-
213
- fp = fopen(dtfile, "r");
214
-
215
- if (fp == NULL){
216
-
217
- printf("ファイルオープンエラー\n");
218
-
219
- return -1;
220
-
221
- }
222
-
223
- printf( "file_size=%ld\n" , file_size );
224
-
225
-
226
-
227
- ptr=(char*)malloc(file_size);
228
-
229
-
230
-
231
- if (ptr == NULL){
232
-
233
- printf("malloc()に失敗しました。\n");
234
-
235
- return -1;
236
-
237
- }
238
-
239
- printf("確保したメモリブロックのアドレス: %p\n\n", ptr);
240
-
241
-
242
-
243
- while(ptr){
244
-
245
- ptr= fgets(buff,100, fp);
246
-
247
-
248
-
249
- if (ptr == NULL){
250
-
251
- printf("読み込みデータなし\n");
252
-
253
- }else{
254
-
255
- printf("%s", ptr);
256
-
257
- }
258
-
259
- }
260
-
261
- data_delete();
262
-
263
- printf("fseek:%d\n", fseek(fp, 0, SEEK_SET));
264
-
265
-
266
-
267
- fclose(fp);
268
-
269
- }
270
-
271
-
272
-
273
- void data_show()
274
-
275
- {
276
-
277
- FILE *fp;
278
-
279
- val=0;
280
-
281
-
282
-
283
- if(!(fp = fopen(dtfile, "r"))){
284
-
285
- printf("ファイルを開くことができません\n");
286
-
287
- exit(1);
288
-
289
- }
290
-
291
- printf("\n名前 番号\n");
292
-
293
-
294
-
295
- printf("-------------------------\n");
296
-
297
-
298
-
299
- while(fscanf(fp, "%s%s", names[val],tel[val])!=-1)
300
-
301
- {
302
-
303
- printf("%-10s%5s\n",names[val], tel[val]);
304
-
305
-
306
-
307
- val++;
308
-
309
- }
310
-
311
- fclose(fp);
312
-
313
- }
314
-
315
-
316
-
317
- void data_delete() {
318
-
319
- static char buff[N];
320
-
321
- FILE *fp;
322
-
323
- int len,name_len,tel_len;
324
-
325
- int i=0;
326
-
327
- val=0;
328
-
329
-
330
-
331
-
332
-
333
- if(!(fp = fopen(dtfile, "r"))){
334
-
335
- printf("ファイルを開くことができません\n");
336
-
337
- exit(1);
338
-
339
- }
340
-
341
- printf("削除する名前を検索します。検索する名前を入力して下さい。\n");
342
-
343
-
344
-
345
- scanf("%s",buff);
346
-
347
-
348
-
349
- while(fscanf(fp, "%s%s", names[val], tel[val])!=-1){
350
-
351
-
352
-
353
- if(strstr(names[val],buff) || strstr(tel[val],buff)){
354
-
355
-
356
-
357
- printf("\n名前が見つかりました\n");
358
-
359
- printf("%-10s%5s\n",names[val],tel[val]);
360
-
361
- i=1;
362
-
363
-
364
-
365
- name_len=strlen( names[0]);
366
-
367
- tel_len =strlen( tel[0]);
368
-
369
- len = 10+tel_len+1;
370
-
371
- printf( "len=%d\n" , len );
372
-
373
- printf( "name_len=%d\n" , name_len );
374
-
375
- printf( "tel_len=%d\n" , tel_len );
376
-
377
-
378
-
379
- //見つかると削除する(ここで削除したい)
380
-
381
-
382
-
383
- }
384
-
385
- }
386
-
387
- printf("削除された名前: %s\n", buff);
388
-
389
- if(i==0) printf("名前が見つかりません: %s\n", buff);
390
-
391
-
392
-
393
- fclose(fp);
394
-
395
-
396
-
397
- }
398
-
399
-
400
-
401
- void trim( char *s )
402
-
403
- {
404
-
405
- int i, j;
406
-
407
-
408
-
409
- //先頭から空白でない文字まで読み飛ばす
410
-
411
- for( i = 0; isspace( s[i] ); i++ ) ;
412
-
413
-
414
-
415
- //前方の空白を詰める
416
-
417
- if( i > 0 ) {
418
-
419
- j = 0;
420
-
421
- while( s[i] ) s[j++] = s[i++];
422
-
423
- s[j] = '\0';
424
-
425
- }
426
-
427
- }
428
-
429
-
430
-
431
-
432
-
433
- 実行結果
434
-
435
- naka@naka ~/kadai/kadai9-8
436
-
437
- $ gcc -o data_tel_delete6 data_tel_delete6.c -Wall
438
-
439
-
440
-
441
- naka@naka ~/kadai/kadai9-8
442
-
443
- $ data_tel_delete6
444
-
445
- file_size=198
446
-
447
- ptr= 4
448
-
449
-
450
-
451
- 名前 番号
452
-
453
- -------------------------
454
-
455
- sachiko ,090-0809
456
-
457
- naka ,090-7777
458
-
459
- kiyoko ,090-9999
460
-
461
- satou ,090-3214
462
-
463
- kinosita ,090-8769
464
-
465
- yamada ,090-4325
466
-
467
- itou ,080-6354
468
-
469
- sudou ,090-3333
470
-
471
- kitou ,080-1342
472
-
473
- 削除する名前を検索します。検索する名前を入力して下さい。
474
-
475
- naka
476
-
477
-
478
-
479
- 名前が見つかりました
480
-
481
- naka ,090-7777
482
-
483
- len=20
484
-
485
- name_len=4
486
-
487
- tel_len=9
488
-
489
- 削除された名前: naka
490
-
491
-
492
-
493
- naka@naka ~/kadai/kadai9-8
494
-
495
- $
496
-
497
- ```