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

質問編集履歴

7

コードの変更

2018/01/06 05:49

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,10 +1,7 @@
1
- 実行結果がおかしいので、修正したいのですが、
2
- 色々やっているとき正常に削除されたのですが、保存しておけばよかったのですが残念です。
3
- 表示は以下の実行結果になります。
1
+ きました。皆さんあがとございます。
4
- lines2[0]=sachiko ,090-0809
5
-
6
- data_tmp.txtに1個だけコピーされいます。
2
+ 次にdata_tel.txtにdata_tmpをコピーこのdelete()
3
+ 関数を完成したいと思います。また
7
- 面倒ですが、ご教授ください。よろしくお願いいたします。
4
+ ご教授ください。よろしくお願いいたします。
8
5
  data_tel.txt
9
6
  sachiko ,090-0809
10
7
  naka ,090-7777
@@ -18,7 +15,7 @@
18
15
 
19
16
  ```
20
17
  コード
21
- // data_kirikae7.c
18
+ // data_kirikae8.c
22
19
  #include <stdio.h>
23
20
  #include <string.h>
24
21
  #include <stdlib.h> //for exit
@@ -32,17 +29,17 @@
32
29
  int main(void)
33
30
  {
34
31
  FILE *fp1,*fp2 ;
35
- char line[Max][40]={0}; // 検索対象文字列を読み込む配列
32
+ char line[Max]={0}; // 検索対象文字列を読み込む配列
36
- char line2[Max][40]={0};
33
+ char line2[Max]={0};
37
34
  char buff[256]; //検索文字列
38
- int i=0,count=0;
35
+ int count=0;
39
36
  char *ptr;
40
37
 
41
38
  if(!(fp1 = fopen(dtfile, "r"))){
42
39
  printf("ファイルを開くことができません\n");
43
40
  return -1;
44
41
  }
45
- if ((fp2 = fopen(dtfile2, "w")) == NULL) {
42
+ if ((fp2 = fopen(dtfile2, "r+")) == NULL) {
46
43
  fprintf(stderr, "ファイルのオープンに失敗しました.\n");
47
44
  return -1;
48
45
  }
@@ -51,16 +48,15 @@
51
48
  scanf("%s",buff);
52
49
 
53
50
  //linesから1行ずつ取り出す。
54
- for(i=0; i<Max && fgets( line[i] , sizeof(line[i]) , fp1 ) != NULL;i++){
51
+ while(fgets(line, 256, fp1) != NULL){
55
- //printf( "lines[%d]=%s" , i,line[i] );
52
+ printf( "line=%s" ,line );
56
53
 
57
- ptr=strstr(line[i],buff);
54
+ ptr=strstr(line,buff);
58
55
  if(ptr){
59
- i++;
60
- fputs(line[i],fp2);
56
+ continue;
61
57
  }else{
62
58
  // 書き込み
63
- fputs(line[i],fp2);
59
+ fputs(line,fp2);
64
60
  count++;
65
61
  if ( count < 0 ) {
66
62
  count=fprintf(stderr, "ファイルの書込みに失敗しました.\n");
@@ -70,34 +66,53 @@
70
66
  fclose(fp2);
71
67
  }
72
68
  fp2 = fopen(dtfile2, "r");
73
- printf("\n");
69
+ printf("\n\n");
74
- for(i=0; i<Max && fgets( line2[i] , sizeof(line2[i]) , fp2 ) != NULL;i++){
70
+ while(fgets(line2, 256, fp2) != NULL){
75
- printf( "lines2[%d]=%s\n" , i,line2[i] );
71
+ printf( "line2=%s",line2);
76
72
  }
77
73
  // ファイルクローズ
78
74
  fclose(fp2);
79
-
75
+ fclose(fp1);
80
76
 
81
77
  }
82
78
 
83
- 【実行結果例】
79
+ /*【実行結果例】
84
80
  naka@naka ~/kadai/kadai9-8
85
- $ gcc -o data_kakikae7 data_kakikae7.c -Wall
81
+ $ gcc -o data_kakikae8 data_kakikae8.c -Wall
86
82
 
87
83
  naka@naka ~/kadai/kadai9-8
88
- $ data_kakikae7
84
+ $ data_kakikae8
89
85
  削除する名前を検索します。検索する名前を入力して下さい。
90
86
  naka
87
+ line=sachiko ,090-0809
88
+ line=naka ,090-7777
89
+ line=kiyoko ,090-9999
90
+ line=satou ,090-3214
91
+ line=kinosita ,090-8769
92
+ line=yamada ,090-4325
93
+ line=itou ,080-6354
94
+ line=sudou ,090-3333
95
+ line=kitou ,080-1342
91
96
 
92
- lines2[0]=sachiko ,090-0809
97
+ line2=sachiko ,090-0809
98
+ line2=kiyoko ,090-9999
99
+ line2=satou ,090-3214
100
+ line2=kinosita ,090-8769
101
+ line2=yamada ,090-4325
102
+ line2=itou ,080-6354
103
+ line2=sudou ,090-3333
104
+ line2=kitou ,080-1342
93
105
 
94
106
  naka@naka ~/kadai/kadai9-8
95
107
  $
96
108
 
109
+ naka@naka ~/kadai/kadai9-8
110
+ $
97
111
 
98
112
 
99
113
 
100
114
 
101
115
 
102
116
 
117
+
103
118
  ```

6

実行結果と質問の修正

2018/01/06 05:49

投稿

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

5

実行結果とコードの修正

2018/01/06 04:34

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,5 @@
1
1
  実行結果がおかしいので、修正したいのですが、どこが悪いのかわかりません。
2
- 色々やっているとき正常に削除されたのですが、
2
+ 色々やっているとき正常に削除されたのですが、保存しておけばよかったのですが残念です。
3
3
  表示では以下の実行結果になります。
4
4
  lines2[0]=sachiko ,090-0809
5
5
  data_tmp.txtに1個だけコピーされています。
@@ -17,7 +17,7 @@
17
17
 
18
18
  ```
19
19
  コード
20
- // data_kirikae6.c
20
+ // data_kirikae7.c
21
21
  #include <stdio.h>
22
22
  #include <string.h>
23
23
  #include <stdlib.h> //for exit
@@ -44,66 +44,59 @@
44
44
  if ((fp2 = fopen(dtfile2, "w")) == NULL) {
45
45
  fprintf(stderr, "ファイルのオープンに失敗しました.\n");
46
46
  return -1;
47
- }
47
+ }
48
48
  printf("削除する名前を検索します。検索する名前を入力して下さい。\n");
49
49
 
50
50
  scanf("%s",buff);
51
51
 
52
52
  //linesから1行ずつ取り出す。
53
53
  for(i=0; i<Max && fgets( line[i] , sizeof(line[i]) , fp1 ) != NULL;i++){
54
- printf( "%s" , line[i] );
54
+ //printf( "lines[%d]=%s" , i,line[i] );
55
55
 
56
56
  ptr=strstr(line[i],buff);
57
57
  if(ptr){
58
58
  i++;
59
59
  fputs(line[i],fp2);
60
60
  }else{
61
- // 書き込み
61
+ // 書き込み
62
62
  fputs(line[i],fp2);
63
63
  count++;
64
- //printf("%d\n" , count);
65
64
  if ( count < 0 ) {
66
- fprintf(stderr, "ファイルの書込みに失敗しました.\n");
65
+ count=fprintf(stderr, "ファイルの書込みに失敗しました.\n");
67
66
  return -1;
68
67
  }
69
68
  }
70
- // ファイルクローズ
71
69
  fclose(fp2);
72
70
  }
73
71
  fp2 = fopen(dtfile2, "r");
74
- printf("\n");
72
+ printf("\n");
75
73
  for(i=0; i<Max && fgets( line2[i] , sizeof(line2[i]) , fp2 ) != NULL;i++){
76
74
  printf( "lines2[%d]=%s\n" , i,line2[i] );
77
75
  }
78
- //このあとdtfile2をdtfileにコピーする。
79
- // ファイルクローズ
76
+ // ファイルクローズ
80
77
  fclose(fp2);
81
- fclose(fp1);
78
+
79
+
82
80
  }
83
-
81
+
84
- 【実行結果】
82
+ 【実行結果
85
83
  naka@naka ~/kadai/kadai9-8
86
- $ gcc -o data_kakikae6 data_kakikae6.c -Wall
84
+ $ gcc -o data_kakikae7 data_kakikae7.c -Wall
87
85
 
88
86
  naka@naka ~/kadai/kadai9-8
89
- $ data_kakikae6
87
+ $ data_kakikae7
90
88
  削除する名前を検索します。検索する名前を入力して下さい。
91
89
  naka
92
- 削除する名前を検索します。検索する名前を入力して下さい。
90
+
93
- naka
94
- sachiko ,090-0809
95
- naka ,090-7777
96
- kiyoko ,090-9999
97
- satou ,090-3214
98
- kinosita ,090-8769
99
- yamada ,090-4325
100
- itou ,080-6354
101
- sudou ,090-3333
102
- kitou ,080-1342
103
91
  lines2[0]=sachiko ,090-0809
104
92
 
93
+ naka@naka ~/kadai/kadai9-8
94
+ $
105
95
 
106
96
 
107
97
 
108
98
 
99
+
100
+
101
+
109
102
  ```

4

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

2018/01/06 04:21

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,8 @@
1
1
  実行結果がおかしいので、修正したいのですが、どこが悪いのかわかりません。
2
+ 色々やっているとき正常に削除されたのですが、
2
- naka ,090-7777を削除したつもりが、表示では以下の実行結果になります。
3
+ 表示では以下の実行結果になります。
4
+ lines2[0]=sachiko ,090-0809
3
- data_tmp.txtはからぽでコピーされていません
5
+ data_tmp.txtに1個だけコピーされていま
4
6
  面倒ですが、ご教授ください。よろしくお願いいたします。
5
7
  data_tel.txt
6
8
  sachiko ,090-0809
@@ -15,7 +17,7 @@
15
17
 
16
18
  ```
17
19
  コード
18
- // data_kirikae7.c
20
+ // data_kirikae6.c
19
21
  #include <stdio.h>
20
22
  #include <string.h>
21
23
  #include <stdlib.h> //for exit
@@ -39,65 +41,69 @@
39
41
  printf("ファイルを開くことができません\n");
40
42
  return -1;
41
43
  }
44
+ if ((fp2 = fopen(dtfile2, "w")) == NULL) {
45
+ fprintf(stderr, "ファイルのオープンに失敗しました.\n");
46
+ return -1;
47
+ }
42
48
  printf("削除する名前を検索します。検索する名前を入力して下さい。\n");
43
49
 
44
50
  scanf("%s",buff);
45
51
 
46
52
  //linesから1行ずつ取り出す。
47
53
  for(i=0; i<Max && fgets( line[i] , sizeof(line[i]) , fp1 ) != NULL;i++){
48
- //printf( "lines[%d]=%s" , i,line[i] );
54
+ printf( "%s" , line[i] );
49
55
 
50
- if ((fp2 = fopen(dtfile2, "w")) == NULL) {
51
- fprintf(stderr, "ファイルのオープンに失敗しました.\n");
52
- return -1;
53
- }
54
56
  ptr=strstr(line[i],buff);
55
57
  if(ptr){
56
- ptr++;
58
+ i++;
57
59
  fputs(line[i],fp2);
58
60
  }else{
59
- // 書き込み
61
+ // 書き込み
60
62
  fputs(line[i],fp2);
63
+ count++;
64
+ //printf("%d\n" , count);
61
65
  if ( count < 0 ) {
62
- count=fprintf(stderr, "ファイルの書込みに失敗しました.\n");
66
+ fprintf(stderr, "ファイルの書込みに失敗しました.\n");
63
67
  return -1;
64
68
  }
65
69
  }
70
+ // ファイルクローズ
71
+ fclose(fp2);
66
72
  }
73
+ fp2 = fopen(dtfile2, "r");
67
- printf("\n");
74
+ printf("\n");
68
75
  for(i=0; i<Max && fgets( line2[i] , sizeof(line2[i]) , fp2 ) != NULL;i++){
69
76
  printf( "lines2[%d]=%s\n" , i,line2[i] );
70
77
  }
78
+ //このあとdtfile2をdtfileにコピーする。
71
- // ファイルクローズ
79
+ // ファイルクローズ
72
80
  fclose(fp2);
73
-
81
+ fclose(fp1);
74
-
75
82
  }
76
-
83
+
77
84
  【実行結果】
78
85
  naka@naka ~/kadai/kadai9-8
79
- $ gcc -o data_kakikae7 data_kakikae7.c -Wall
86
+ $ gcc -o data_kakikae6 data_kakikae6.c -Wall
80
87
 
81
88
  naka@naka ~/kadai/kadai9-8
82
- $ data_kakikae7
89
+ $ data_kakikae6
83
90
  削除する名前を検索します。検索する名前を入力して下さい。
84
91
  naka
92
+ 削除する名前を検索します。検索する名前を入力して下さい。
85
93
  naka
94
+ sachiko ,090-0809
95
+ naka ,090-7777
96
+ kiyoko ,090-9999
97
+ satou ,090-3214
98
+ kinosita ,090-8769
99
+ yamada ,090-4325
100
+ itou ,080-6354
101
+ sudou ,090-3333
102
+ kitou ,080-1342
103
+ lines2[0]=sachiko ,090-0809
86
104
 
87
- lines2[0]=
88
- lines2[1]=
89
- lines2[2]=
90
105
 
91
- .....省略
92
106
 
93
- lines2[97]=
94
- lines2[98]=
95
- lines2[99]=
96
107
 
97
- naka@naka ~/kadai/kadai9-8
98
- $
99
108
 
100
-
101
-
102
-
103
109
  ```

3

新しいコードと質問変更

2018/01/06 04:08

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,16 +1,7 @@
1
1
  実行結果がおかしいので、修正したいのですが、どこが悪いのかわかりません。
2
- 面倒ですが、ご教授ください。
3
- 1.実際のdata_tel.txtのnaka ,090-7777削除されてい
2
+ naka ,090-7777削除したつもりが、表示では以下の実行結果にります
4
-  実行結果の端末で錯書されていま
3
+ data_tmp.txtからぽでコピーされていません
5
- 2.名前のアドレス:00408080
6
-   名前のアドレス:00408080 が2回表示される。1回にしたい。
7
- 3.名前のアドレス:00408080(sp1)と見つかった名前のアドレス:00408080
8
-   おなじである。実際はポインタが1個進んでいるはずですが、進んでないか、
9
-   sp1がおかしいかと思います。
10
- 4.アドレスがチャンとしていれば、見つかった位置は1番目になるはずです。
11
-
12
- 5.名前が見つかりません: nakaと表示される。
13
- 以上です。よろしくお願いいたします。
4
+ 面倒ですが、ご教授ください。よろしくお願いいたします。
14
5
  data_tel.txt
15
6
  sachiko ,090-0809
16
7
  naka ,090-7777
@@ -24,151 +15,89 @@
24
15
 
25
16
  ```
26
17
  コード
27
- // data_kirikae6.c
18
+ // data_kirikae7.c
28
19
  #include <stdio.h>
29
20
  #include <string.h>
30
21
  #include <stdlib.h> //for exit
31
22
  #include <sys\stat.h>
32
23
 
33
- #define MAX 100
24
+ #define Max 100
34
25
 
35
26
  char dtfile[]="data_tel.txt";
36
27
  char dtfile2[]="data_tmp.txt";
37
- char names[MAX][20]; // MAX100人、20文字
38
- char tel[MAX][20]; // MAX100人、20文字
39
28
 
40
- long getFileSize(char *dtfile);
41
-
42
29
  int main(void)
43
30
  {
44
31
  FILE *fp1,*fp2 ;
45
- char line[256]={0}; // 検索対象文字列を読み込む配列
32
+ char line[Max][40]={0}; // 検索対象文字列を読み込む配列
33
+ char line2[Max][40]={0};
46
- char buff[256]; //検索文字列
34
+ char buff[256]; //検索文字列
35
+ int i=0,count=0;
36
+ char *ptr;
47
37
 
48
- char *sp1,*sp2;
49
-
50
- int i=0;
51
- int val=0; // 名前と番号の配列番号
52
- long file_size;
53
- char * ptr=NULL;
54
-
55
- if(!(fp1 = fopen(dtfile, "r"))){
38
+ if(!(fp1 = fopen(dtfile, "r"))){
56
39
  printf("ファイルを開くことができません\n");
57
- exit(1);
40
+ return -1;
58
41
  }
59
42
  printf("削除する名前を検索します。検索する名前を入力して下さい。\n");
60
43
 
61
44
  scanf("%s",buff);
45
+
62
-
46
+ //linesから1行ずつ取り出す。
63
- while(fscanf(fp1, "%s%s", names[val], tel[val])!=-1){
47
+ for(i=0; i<Max && fgets( line[i] , sizeof(line[i]) , fp1 ) != NULL;i++){
64
- sp1=names[0];
65
- printf("名前のアドレス:%-10p\n",sp1);
48
+ //printf( "lines[%d]=%s" , i,line[i] );
49
+
66
- if(strstr(names[val],buff) || strstr(tel[val],buff)){
50
+ if ((fp2 = fopen(dtfile2, "w")) == NULL) {
67
- printf("\n名前が見つかりました\n");
51
+ fprintf(stderr, "ファイルのオープンに失敗しました\n");
68
-
69
- printf("%-10s%5s\n",names[val],tel[val]);
52
+ return -1;
70
-
53
+ }
71
- sp2=strstr(names[val],buff);
54
+ ptr=strstr(line[i],buff);
72
- printf("見つかった名前のアドレス:%-10p\n",sp2);
73
-
74
- i=sp2-sp1;
55
+ if(ptr){
75
- printf("%d番目です\n",i);
56
+ ptr++;
76
-
77
- file_size=getFileSize(dtfile);
57
+ fputs(line[i],fp2);
78
-
79
- printf("%sのサイズ: %ld\n", dtfile, file_size);
58
+ }else{
80
-
81
- //mallocでメモリを確保する
59
+ // 書き込み
82
- ptr = (char *)malloc(file_size);
60
+ fputs(line[i],fp2);
83
-
84
- if (ptr == NULL)
61
+ if ( count < 0 ) {
85
- {
86
- printf("malloc()に失敗しました\n");
62
+ count=fprintf(stderr, "ファイルの書込みに失敗しました.\n");
87
63
  return -1;
88
- }
89
- printf("確保したメモリブロックのアドレス: %p\n", ptr);
90
-
91
- fp2= fopen(dtfile2, "w");
92
-
93
- //buffが配列の何番目かを見つける
94
- //i番目の場合,i-1までdata_tmp.txtに書き込む
95
- fprintf(fp2, "%s", line-1);
96
- fclose(fp2);
97
-
98
- //読み込んだdata_tel.txtの次のデータを
99
- //data_tmp.txtにn+1から末尾まで追加書き込みする。
100
- fp2= fopen(dtfile2, "a");
101
- fprintf(fp2, "%s", line+1);
102
- fclose(fp2);
103
- //data_tmp.txtをdata_tel.txtにコピーする。
104
- fp2= fopen(dtfile2, "w");
105
- strcpy(dtfile, dtfile2);
106
- //data_tel.txtを表示する。
107
- while (fgets(line, 256, fp1)!=NULL){
108
- printf("%s", line);
109
64
  }
110
- printf("\n");
111
- }
65
+ }
112
-
113
66
  }
67
+ printf("\n");
68
+ for(i=0; i<Max && fgets( line2[i] , sizeof(line2[i]) , fp2 ) != NULL;i++){
114
- printf("削除された名前: %s\n", buff);
69
+ printf( "lines2[%d]=%s\n" , i,line2[i] );
70
+ }
115
- if(i==0) printf("名前が見つかりません: %s\n", buff);
71
+ // ファイルクローズ
116
-
117
- fclose(fp2);
72
+ fclose(fp2);
118
- fclose(fp1);
73
+
119
-
74
+
120
75
  }
121
76
 
122
- long getFileSize(char *dtfile)
123
- {
124
- struct stat statBuf;
125
- int file_size;
126
-
127
- if (stat(dtfile, &statBuf) == 0)
128
- // ファイルfileからファイル情報を取得し、
129
- // stat構造体変数statBuf)に格納する。
130
-
131
- file_size = (int)(statBuf.st_size); // サイズを取得
132
- printf("size: %d(バイト)\n",file_size); // 表示
133
-
134
- return statBuf.st_size;
135
- // off_t st_size; // 全体のサイズ (バイト単位)
136
-
137
- return -1L;
138
- }
139
-
140
77
  【実行結果】
141
78
  naka@naka ~/kadai/kadai9-8
142
- $ gcc -o data_kakikae5 data_kakikae5.c -Wall
79
+ $ gcc -o data_kakikae7 data_kakikae7.c -Wall
143
80
 
144
81
  naka@naka ~/kadai/kadai9-8
145
- $ data_kakikae5
82
+ $ data_kakikae7
146
83
  削除する名前を検索します。検索する名前を入力して下さい。
147
84
  naka
148
- 名前のアドレス:00408080
85
+ naka
149
- 名前のアドレス:00408080
150
86
 
151
- 名前が見つかりました
87
+ lines2[0]=
152
- naka ,090-7777
153
- 見つかった名前のアドレス:00408080
154
- 0番目です
155
- size: 196(バイト)
88
+ lines2[1]=
156
- data_tel.txtのサイズ: 196
89
+ lines2[2]=
157
- 確保したメモリブロックのアドレス: 02712A50
158
90
 
159
- kiyoko ,090-9999
160
- satou ,090-3214
161
- kinosita ,090-8769
162
- yamada ,090-4325
163
- itou ,080-6354
164
- sudou ,090-3333
165
- kitou ,080-1342
166
- 削除された名前: naka
91
+ .....省略
167
- 名前が見つかりません: naka
168
92
 
93
+ lines2[97]=
94
+ lines2[98]=
95
+ lines2[99]=
96
+
169
97
  naka@naka ~/kadai/kadai9-8
170
98
  $
171
99
 
172
100
 
173
101
 
102
+
174
103
  ```

2

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

2018/01/06 02:50

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,11 +1,16 @@
1
- teratailでご教授頂た指針やってすが先に
1
+ 実行結果がおかし、修正したのですが、どこが悪いのかわかりません。
2
+ 面倒ですが、ご教授ください。
3
+ 1.実際のdata_tel.txtのnaka ,090-7777が削除されていない。
2
- 進まないのでよろしくお願いたします。
4
+  実行結果端末は錯書されています。
3
- 一時ファイルハンルを得るところまで来ていますが、
5
+ 2.名前レス:00408080
4
- 引数がこんがらがって良くわかりません。わたしのコードに合わせて
5
- 修正してほしいのですが、修正の範囲はコードに示しています。
6
- 削除したい名前の先頭アドレスまでわかっています。fwrite()の引数が1つ不足ます
6
+   名前のアドレス:00408080 2回表示される。1回にい。
7
+ 3.名前のアドレス:00408080(sp1)と見つかった名前のアドレス:00408080
8
+   おなじである。実際はポインタが1個進んでいるはずですが、進んでないか、
7
- できればfputs()を使ので
9
+   sp1がおかしかと思す。
10
+ 4.アドレスがチャンとしていれば、見つかった位置は1番目になるはずです。
11
+
12
+ 5.名前が見つかりません: nakaと表示される。
8
- よろしくお願いいたします。
13
+ 以上です。よろしくお願いいたします。
9
14
  data_tel.txt
10
15
  sachiko ,090-0809
11
16
  naka ,090-7777
@@ -19,7 +24,7 @@
19
24
 
20
25
  ```
21
26
  コード
22
- // data_kirikae5.c
27
+ // data_kirikae6.c
23
28
  #include <stdio.h>
24
29
  #include <string.h>
25
30
  #include <stdlib.h> //for exit
@@ -28,6 +33,7 @@
28
33
  #define MAX 100
29
34
 
30
35
  char dtfile[]="data_tel.txt";
36
+ char dtfile2[]="data_tmp.txt";
31
37
  char names[MAX][20]; // MAX100人、20文字
32
38
  char tel[MAX][20]; // MAX100人、20文字
33
39
 
@@ -36,14 +42,15 @@
36
42
  int main(void)
37
43
  {
38
44
  FILE *fp1,*fp2 ;
39
- //char* search_str={0}; //検索文字列
45
+ char line[256]={0}; // 検索対象文字列を読み込む配列
40
- static char buff[256]; // 検索対象文字列
46
+ char buff[256]; //検索文字列
47
+
41
- char* sp;
48
+ char *sp1,*sp2;
42
- int len,name_len,tel_len;
49
+
43
50
  int i=0;
44
51
  int val=0; // 名前と番号の配列番号
45
52
  long file_size;
46
- char * ptr;
53
+ char * ptr=NULL;
47
54
 
48
55
  if(!(fp1 = fopen(dtfile, "r"))){
49
56
  printf("ファイルを開くことができません\n");
@@ -54,27 +61,25 @@
54
61
  scanf("%s",buff);
55
62
 
56
63
  while(fscanf(fp1, "%s%s", names[val], tel[val])!=-1){
64
+ sp1=names[0];
65
+ printf("名前のアドレス:%-10p\n",sp1);
57
66
  if(strstr(names[val],buff) || strstr(tel[val],buff)){
58
67
  printf("\n名前が見つかりました\n");
68
+
59
69
  printf("%-10s%5s\n",names[val],tel[val]);
60
- sp=strstr(names[val],buff);
61
- printf("見つかった名前のアドレス:%-10p\n",sp);
62
- i=1;
63
70
 
64
- name_len=strlen( names[0]);
71
+ sp2=strstr(names[val],buff);
65
- tel_len =strlen( tel[0]);
72
+ printf("見つかった名前のアドレス:%-10p\n",sp2);
73
+
66
- len = 10+tel_len+1;
74
+ i=sp2-sp1;
67
-
68
- printf( "len=%d\n" , len );
75
+ printf("%d番目です\n",i);
69
- printf( "name_len=%d\n" , name_len );
76
+
70
- printf( "tel_len=%d\n" , tel_len );
71
-
72
- file_size=getFileSize(dtfile);
77
+ file_size=getFileSize(dtfile);
73
78
 
74
79
  printf("%sのサイズ: %ld\n", dtfile, file_size);
75
80
 
76
81
  //mallocでメモリを確保する
77
- ptr = ( char * )malloc(file_size);
82
+ ptr = (char *)malloc(file_size);
78
83
 
79
84
  if (ptr == NULL)
80
85
  {
@@ -83,17 +88,30 @@
83
88
  }
84
89
  printf("確保したメモリブロックのアドレス: %p\n", ptr);
85
90
 
86
- //ここから修正したい(ここで削除したい)上のコードに合わせて書き換えたい
87
- fp2= fopen(dtfile, "wb");
91
+ fp2= fopen(dtfile2, "w");
92
+
88
-
93
+ //buffが配列の何番目かを見つける
94
+ //i番目の場合,i-1までdata_tmp.txtに書き込む
95
+ fprintf(fp2, "%s", line-1);
96
+ fclose(fp2);
97
+
98
+ //読み込んだdata_tel.txtの次のデータを
99
+ //data_tmp.txtにn+1から末尾まで追加書き込みする。
100
+ fp2= fopen(dtfile2, "a");
101
+ fprintf(fp2, "%s", line+1);
102
+ fclose(fp2);
103
+ //data_tmp.txtをdata_tel.txtにコピーする。
104
+ fp2= fopen(dtfile2, "w");
105
+ strcpy(dtfile, dtfile2);
106
+ //data_tel.txtを表示する。
89
- const char* delete_str_front = NULL;
107
+ while (fgets(line, 256, fp1)!=NULL){
90
- for(const char* p = input_str;NULL != (delete_str_front = strstr(input_str, search_str)); p = delete_str_front + search_str_len){
91
- fwrite(tmp_file_handle, p, delete_str_front - p);
108
+ printf("%s", line);
92
- }
109
+ }
110
+ printf("\n");
93
- }
111
+ }
94
- //ここまでを修正したい
112
+
95
- }
113
+ }
96
- //printf("削除された名前: %s\n", buff);
114
+ printf("削除された名前: %s\n", buff);
97
115
  if(i==0) printf("名前が見つかりません: %s\n", buff);
98
116
 
99
117
  fclose(fp2);
@@ -119,24 +137,38 @@
119
137
  return -1L;
120
138
  }
121
139
 
122
- 【実行結果
140
+ 【実行結果】
123
141
  naka@naka ~/kadai/kadai9-8
124
- $ gcc -o data_kakikae3 data_kakikae3.c -Wall
142
+ $ gcc -o data_kakikae5 data_kakikae5.c -Wall
125
143
 
126
144
  naka@naka ~/kadai/kadai9-8
127
- $ data_kakikae3
145
+ $ data_kakikae5
128
146
  削除する名前を検索します。検索する名前を入力して下さい。
129
147
  naka
148
+ 名前のアドレス:00408080
149
+ 名前のアドレス:00408080
130
150
 
131
151
  名前が見つかりました
132
152
  naka ,090-7777
133
- 見つかった名前のアドレス:00407180
153
+ 見つかった名前のアドレス:00408080
134
- len=20
154
+ 0番目です
135
- name_len=4
136
- tel_len=9
137
- size: 198(バイト)
155
+ size: 196(バイト)
138
- data_tel.txtのサイズ: 198
156
+ data_tel.txtのサイズ: 196
139
- 確保したメモリブロックのアドレス: 026E2A50
157
+ 確保したメモリブロックのアドレス: 02712A50
140
158
 
159
+ kiyoko ,090-9999
160
+ satou ,090-3214
161
+ kinosita ,090-8769
162
+ yamada ,090-4325
163
+ itou ,080-6354
164
+ sudou ,090-3333
165
+ kitou ,080-1342
166
+ 削除された名前: naka
167
+ 名前が見つかりません: naka
141
168
 
169
+ naka@naka ~/kadai/kadai9-8
170
+ $
171
+
172
+
173
+
142
174
  ```

1

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

2018/01/05 16:35

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,35 +1,10 @@
1
1
  teratailでご教授頂いた指針でやっていますが先に
2
2
  進まないのでよろしくお願いいたします。
3
- 別ファイルに書き出して元ファイル削除してリネームという手法になる。
4
- ファイル削除はremove、ファイル名変更はrenameを使う。
5
- 1.現状のコード同様文字列検索する。
6
- data_tel_delete1.cでクリア
7
-
8
- 2. 一つでも見つかったらfstatでファイルサイズを求める
9
- getfileSize(data_tel)でクリア,198バイト
10
-
11
- 3. ファイルサイズ分のメモリーを確保
12
- ファイルサイズ198バイト分のメモリを確保する。
13
-
14
-  char *ptr;
15
-  ptr=(char*)malloc(size); クリア
16
-  
17
-  getfileSize(data_tel)でクリア
18
-
19
- 4.fseekでファイル先頭に戻り、mallocで確保したメモリ(ptr)へ
20
- 読み込み。 一時ファイルのハンドルを得る
21
- delete_seek.cでクリア
22
-
23
- 5.strstrを駆使しながら削除部分以外を一時ファイルに
24
- fputs()関数で書き込んでいきたい。クリアできていないです。
25
-   ここから少し具体的な指針をお願い致します。
26
-     data_tel.txtの2番目の naka ,090-7777を削除する。
27
-     naka の先頭アドレスを求めてその前の
28
-     最初のsachiko ,090-0809をtmpファイルにコピーする。
29
-     そのあと後kiyoko ,090-9999の先頭アドレスに移動して
30
-     そこからあとを一時ファイルに追加する。
31
-     一時ファイルを元data_tel.txtにコピーす
3
+ 一時ファイルのハンドルを得ところまで来ていますが、
4
+ 引数がこんがらがって良くわかりません。わたしのコードに合わせて
5
+ 修正してほしいのですが、修正の範囲はコードに示しています。
6
+ 削除したい名前の先頭アドレスまでわかっています。fwrite()の引数が1つ不足しています。
32
-     remove、renameを使いたいのですが。
7
+ できればfputs()を使いたいのですが。
33
8
  よろしくお願いいたします。
34
9
  data_tel.txt
35
10
  sachiko ,090-0809
@@ -44,206 +19,124 @@
44
19
 
45
20
  ```
46
21
  コード
22
+ // data_kirikae5.c
47
- #include<stdio.h>
23
+ #include <stdio.h>
48
- #include<string.h> //for strcmp,strstr
24
+ #include <string.h>
49
- #include<stdlib.h> //for exit
25
+ #include <stdlib.h> //for exit
50
- #include <fcntl.h>
51
- #include <sys/stat.h>
26
+ #include <sys\stat.h>
52
- #include <sys/types.h>
53
- #include <unistd.h>
54
- #include <ctype.h>
55
27
 
56
- #define N 256
28
+ #define MAX 100
57
- #define MAX 100 // MAX100人
58
- #define ERR_PRINTF_EXIT(...) do { fprintf(stderr, __VA_ARGS__); exit(EXIT_FAILURE); } while(0)
59
29
 
60
30
  char dtfile[]="data_tel.txt";
61
-
62
31
  char names[MAX][20]; // MAX100人、20文字
63
32
  char tel[MAX][20]; // MAX100人、20文字
64
- int val; // 名前と番号の配列番号
65
33
 
66
- void data_show(); // データ表示
67
- void data_delete();
34
+ long getFileSize(char *dtfile);
68
35
 
69
- static long getFileSize(const char *dtfile)
36
+ int main(void)
70
37
  {
71
- FILE *fp;
38
+ FILE *fp1,*fp2 ;
39
+ //char* search_str={0}; //検索文字列
40
+ static char buff[256]; // 検索対象文字列
41
+ char* sp;
42
+ int len,name_len,tel_len;
43
+ int i=0;
44
+ int val=0; // 名前と番号の配列番号
72
- long file_size;
45
+ long file_size;
73
- struct stat stbuf;
74
- int fd;
75
-
76
- fd=open(dtfile, O_RDONLY);
77
-
78
- if (fd == -1)
79
- ERR_PRINTF_EXIT("cant open file : %s.\n", dtfile);
80
-
81
- fp = fdopen(fd, "rb");
82
- if (fp == NULL)
83
- ERR_PRINTF_EXIT("cant open file : %s.\n", dtfile);
84
-
85
- if (fstat(fd, &stbuf) == -1)
86
- // fstat() は、正常終了時には 0 を戻します。
87
-
88
- ERR_PRINTF_EXIT("cant get file state : %s.\n", dtfile);
89
-
90
- file_size = stbuf.st_size;
91
-
92
- if (fclose(fp) != 0)
93
- ERR_PRINTF_EXIT("cant close file : %s.\n", dtfile);
94
-
95
- return file_size;
96
- }
97
-
98
- int main()
99
- {
100
- FILE *fp;
101
- long file_size=0;
102
- char *ptr;
46
+ char * ptr;
103
- char buff[1000];
47
+
104
-
105
- file_size=getFileSize(dtfile);
106
-
107
- fp = fopen(dtfile, "r");
108
- if (fp == NULL){
109
- printf("ファイルオープンエラー\n");
110
- return -1;
111
- }
112
- printf( "file_size=%ld\n" , file_size );
113
-
114
- ptr=(char*)malloc(file_size);
115
-
116
- if (ptr == NULL){
117
- printf("malloc()に失敗しました。\n");
118
- return -1;
119
- }
120
- printf("確保したメモリブロックのアドレス: %p\n\n", ptr);
121
-
122
- while(ptr){
123
- ptr= fgets(buff,100, fp);
124
-
125
- if (ptr == NULL){
126
- printf("読み込みデータなし\n");
127
- }else{
128
- printf("%s", ptr);
129
- }
130
- }
131
- data_delete();
132
- printf("fseek:%d\n", fseek(fp, 0, SEEK_SET));
133
-
134
- fclose(fp);
135
- }
136
-
137
- void data_show()
138
- {
139
- FILE *fp;
140
- val=0;
141
-
142
- if(!(fp = fopen(dtfile, "r"))){
48
+ if(!(fp1 = fopen(dtfile, "r"))){
143
- printf("ファイルを開くことができません\n");
144
- exit(1);
145
- }
146
- printf("\n名前 番号\n");
147
-
148
- printf("-------------------------\n");
149
-
150
- while(fscanf(fp, "%s%s", names[val],tel[val])!=-1)
151
- {
152
- printf("%-10s%5s\n",names[val], tel[val]);
153
-
154
- val++;
155
- }
156
- fclose(fp);
157
- }
158
-
159
- void data_delete() {
160
- static char buff[N];
161
- FILE *fp;
162
- int len,name_len,tel_len;
163
- int i=0;
164
- val=0;
165
-
166
-
167
- if(!(fp = fopen(dtfile, "r"))){
168
49
  printf("ファイルを開くことができません\n");
169
50
  exit(1);
170
- }
51
+ }
171
- printf("削除する名前を検索します。検索する名前を入力して下さい。\n");
52
+ printf("削除する名前を検索します。検索する名前を入力して下さい。\n");
172
53
 
173
- scanf("%s",buff);
54
+ scanf("%s",buff);
174
55
 
175
- while(fscanf(fp, "%s%s", names[val], tel[val])!=-1){
56
+ while(fscanf(fp1, "%s%s", names[val], tel[val])!=-1){
176
-
177
- if(strstr(names[val],buff) || strstr(tel[val],buff)){
57
+ if(strstr(names[val],buff) || strstr(tel[val],buff)){
178
-
179
58
  printf("\n名前が見つかりました\n");
180
59
  printf("%-10s%5s\n",names[val],tel[val]);
60
+ sp=strstr(names[val],buff);
61
+ printf("見つかった名前のアドレス:%-10p\n",sp);
181
62
  i=1;
182
63
 
183
64
  name_len=strlen( names[0]);
184
65
  tel_len =strlen( tel[0]);
185
66
  len = 10+tel_len+1;
67
+
186
- printf( "len=%d\n" , len );
68
+ printf( "len=%d\n" , len );
187
69
  printf( "name_len=%d\n" , name_len );
188
70
  printf( "tel_len=%d\n" , tel_len );
189
71
 
72
+ file_size=getFileSize(dtfile);
73
+
74
+ printf("%sのサイズ: %ld\n", dtfile, file_size);
75
+
76
+ //mallocでメモリを確保する
77
+ ptr = ( char * )malloc(file_size);
78
+
79
+ if (ptr == NULL)
80
+ {
81
+ printf("malloc()に失敗しました。\n");
82
+ return -1;
83
+ }
84
+ printf("確保したメモリブロックのアドレス: %p\n", ptr);
85
+
190
- //見つると削除する(ここで削除したい)
86
+ //ここら修正したい(ここで削除したい)上のコードに合わせて書き換えたい
191
-
87
+ fp2= fopen(dtfile, "wb");
88
+
89
+ const char* delete_str_front = NULL;
90
+ for(const char* p = input_str;NULL != (delete_str_front = strstr(input_str, search_str)); p = delete_str_front + search_str_len){
91
+ fwrite(tmp_file_handle, p, delete_str_front - p);
92
+ }
192
93
  }
94
+ //ここまでを修正したい
193
- }
95
+ }
194
- printf("削除された名前: %s\n", buff);
96
+ //printf("削除された名前: %s\n", buff);
195
- if(i==0) printf("名前が見つかりません: %s\n", buff);
97
+ if(i==0) printf("名前が見つかりません: %s\n", buff);
196
98
 
197
- fclose(fp);
99
+ fclose(fp2);
100
+ fclose(fp1);
198
101
 
199
102
  }
200
103
 
201
- void trim( char *s )
104
+ long getFileSize(char *dtfile)
202
105
  {
106
+ struct stat statBuf;
203
- int i, j;
107
+ int file_size;
108
+
204
-
109
+ if (stat(dtfile, &statBuf) == 0)
205
- //先頭から空白でない文字まで読み飛ばす
110
+ // ファイルfileからファイル情報を取得し、
206
- for( i = 0; isspace( s[i] ); i++ ) ;
111
+ // stat構造体変数statBuf)に格納する。
207
112
 
208
- //前方の空白を詰める
209
- if( i > 0 ) {
210
- j = 0;
211
- while( s[i] ) s[j++] = s[i++];
113
+ file_size = (int)(statBuf.st_size); // サイズを取得
114
+ printf("size: %d(バイト)\n",file_size); // 表示
115
+
212
- s[j] = '\0';
116
+ return statBuf.st_size;
117
+ // off_t st_size; // 全体のサイズ (バイト単位)
118
+
213
- }
119
+ return -1L;
214
120
  }
215
121
 
216
-
217
- 実行結果
122
+ 実行結果例】
218
123
  naka@naka ~/kadai/kadai9-8
219
- $ gcc -o data_tel_delete6 data_tel_delete6.c -Wall
124
+ $ gcc -o data_kakikae3 data_kakikae3.c -Wall
220
125
 
221
126
  naka@naka ~/kadai/kadai9-8
222
- $ data_tel_delete6
127
+ $ data_kakikae3
223
- file_size=198
224
- ptr= 4
225
-
226
- 名前 番号
227
- -------------------------
228
- sachiko ,090-0809
229
- naka ,090-7777
230
- kiyoko ,090-9999
231
- satou ,090-3214
232
- kinosita ,090-8769
233
- yamada ,090-4325
234
- itou ,080-6354
235
- sudou ,090-3333
236
- kitou ,080-1342
237
128
  削除する名前を検索します。検索する名前を入力して下さい。
238
129
  naka
239
130
 
240
131
  名前が見つかりました
241
132
  naka ,090-7777
133
+ 見つかった名前のアドレス:00407180
242
134
  len=20
243
135
  name_len=4
244
136
  tel_len=9
245
- 削除された名前: naka
137
+ size: 198(バイト)
138
+ data_tel.txtのサイズ: 198
139
+ 確保したメモリブロックのアドレス: 026E2A50
246
140
 
247
- naka@naka ~/kadai/kadai9-8
141
+
248
- $
249
142
  ```