質問編集履歴
2
質問の方法が不適切だったため、質問内容を変更しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
C言語を始めて3か月の初心者です。
|
3
3
|
住所録プログラムを作成しています。
|
4
4
|
以下のソースコードで、Register関数を用いてファイルmemo.txtに入力した文字列配列をSearch関数で検索(出力)すると正しく表示されません。次のように出力するためにはどう修正したら良いのでしょうか。
|
5
|
-
|
5
|
+
|
6
6
|
宜しくお願い致します。
|
7
7
|
|
8
8
|
memo.txtの内容:
|
@@ -163,48 +163,7 @@
|
|
163
163
|
if(!found) printf("そのような%sは存在しません。\n", element[select]);
|
164
164
|
}
|
165
165
|
|
166
|
-
//全データの閲覧
|
167
|
-
void ListAll(InfoList list, FILE *fp){
|
168
|
-
fp = fopen("memo.txt", "r");
|
169
|
-
int ID;
|
170
|
-
for(ID=1; ID<=SIZE; ID++){
|
171
|
-
fscanf(fp, "%s", list[ID].name);
|
172
|
-
fscanf(fp, "%s", list[ID].zipcode);
|
173
|
-
fscanf(fp, "%s", list[ID].address);
|
174
|
-
fscanf(fp, "%s", list[ID].tel);
|
175
|
-
if(list[ID].name[0] == '\0') continue;
|
176
|
-
printf("-------------------------------\n");
|
177
|
-
OutputInfo(list, ID, fp);
|
178
|
-
}
|
179
|
-
}
|
180
166
|
|
181
|
-
//既存のデータを空白に書き換え
|
182
|
-
void Clear(Info *info){
|
183
|
-
memset(info, '\0', sizeof(*info));
|
184
|
-
}
|
185
|
-
|
186
|
-
//データの削除
|
187
|
-
void Delete(InfoList list, FILE *fp){
|
188
|
-
fp = fopen("memo.txt", "a");
|
189
|
-
printf("削除したいデータの");
|
190
|
-
int ID = InputID();
|
191
|
-
printf("データを削除しますか? 1.yes 2.no\n");
|
192
|
-
while(true){
|
193
|
-
int select = 0;
|
194
|
-
if(scanf("%d", &select) != 1) exit(1);
|
195
|
-
if(select == 1){
|
196
|
-
fscanf(fp, "%s", list[ID]);
|
197
|
-
Clear(&list[ID]);
|
198
|
-
printf("データを削除しました。\n");
|
199
|
-
return;
|
200
|
-
}else if(select == 2){
|
201
|
-
printf("削除を中止しました。\n");
|
202
|
-
return;
|
203
|
-
}
|
204
|
-
printf("1か2を再入力して下さい。\n");
|
205
|
-
}
|
206
|
-
}
|
207
|
-
|
208
167
|
//メインメニュー
|
209
168
|
int main(){
|
210
169
|
FILE *fp;
|
@@ -214,18 +173,14 @@
|
|
214
173
|
printf("---------------住所録プログラム--------------\n");
|
215
174
|
printf("1:登録\n");
|
216
175
|
printf("2:検索\n");
|
217
|
-
printf("3:閲覧\n");
|
218
|
-
printf("4:削除\n");
|
219
|
-
printf("
|
176
|
+
printf("3:終了\n");
|
220
177
|
printf("行う操作の番号を入力して下さい。\n");
|
221
178
|
if(scanf("%d", &MenuID) != 1) exit(1);
|
222
179
|
system("cls");
|
223
180
|
switch(MenuID){
|
224
181
|
case 1: Register(list, fp); break;
|
225
182
|
case 2: Search(list, fp); break;
|
226
|
-
case 3: ListAll(list, fp); break;
|
227
|
-
case 4: Delete(list, fp); break;
|
228
|
-
case
|
183
|
+
case 3: return 0;
|
229
184
|
default: printf("不正な番号です。再入力して下さい。\n"); break;
|
230
185
|
}
|
231
186
|
}
|
1
質問の方法が不適切だったため、質問内容を変更しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,15 +1,57 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
2
|
C言語を始めて3か月の初心者です。
|
3
3
|
住所録プログラムを作成しています。
|
4
|
-
前回teratailのおかげでソースコード(以下に記載)は完成したのですが、名前などの情報をファイルに入出力する方法が分かりません。fprintfやfscanfを用いて数値をファイルに入出力する練習はしたのですが、文字列の扱いが難しく困っています。
|
5
|
-
様々なサイトを検索して回ったのですが、自分の知識では理解不可能でした。
|
6
|
-
以下のソースコードを
|
4
|
+
以下のソースコードで、Register関数を用いてファイルmemo.txtに入力した文字列配列をSearch関数で検索(出力)すると正しく表示されません。次のように出力するためにはどう修正したら良いのでしょうか。
|
7
|
-
また、
|
5
|
+
また、他に誤ったコードを記述している関数があれば教えて頂けると幸いです。
|
8
6
|
宜しくお願い致します。
|
9
7
|
|
8
|
+
memo.txtの内容:
|
9
|
+
```
|
10
|
+
A0000000placeA0000000000
|
11
|
+
B1111111placeB1111111111
|
12
|
+
C2222222placeC2222222222
|
13
|
+
```
|
14
|
+
以下のように表示したい:
|
15
|
+
```
|
16
|
+
検索したいIDは?(1~100)
|
17
|
+
1
|
18
|
+
IDの認証に成功しました。
|
19
|
+
名前:A
|
20
|
+
郵便番号:0000000
|
21
|
+
住所:placeA
|
22
|
+
電話番号:00000000000
|
23
|
+
|
24
|
+
検索したいIDは?(1~100)
|
25
|
+
2
|
26
|
+
IDの認証に成功しました。
|
27
|
+
名前:B
|
28
|
+
郵便番号:1111111
|
29
|
+
住所:placeB
|
30
|
+
電話番号:1111111111
|
31
|
+
|
32
|
+
検索したいIDは?(1~100)
|
33
|
+
3
|
34
|
+
IDの認証に成功しました。
|
35
|
+
名前:C
|
36
|
+
郵便番号:2222222
|
37
|
+
住所:placeC
|
38
|
+
電話番号:2222222222
|
39
|
+
```
|
40
|
+
宜しくお願い致します。
|
41
|
+
|
10
42
|
### 発生している問題
|
43
|
+
次のように表示されてしまう。
|
44
|
+
```
|
45
|
+
検索したいIDは?(1~100)
|
46
|
+
1
|
47
|
+
IDの認証に成功しました。
|
48
|
+
ID:1
|
49
|
+
名前:A0000000placeA0000000000
|
50
|
+
郵便番号:B1111111placeB1111111111
|
51
|
+
住所:C2222222placeC2222222222
|
52
|
+
電話番号:
|
11
53
|
|
12
|
-
|
54
|
+
```
|
13
55
|
|
14
56
|
### 該当のソースコード
|
15
57
|
|
@@ -58,8 +100,12 @@
|
|
58
100
|
}
|
59
101
|
|
60
102
|
//ID・名前・郵便番号・住所・電話番号の出力
|
61
|
-
void OutputInfo(InfoList list, int ID){
|
103
|
+
void OutputInfo(InfoList list, int ID, FILE *fp){
|
62
104
|
printf("ID:%d\n", ID);
|
105
|
+
fscanf(fp, "%s", list[ID].name);
|
106
|
+
fscanf(fp, "%s", list[ID].zipcode);
|
107
|
+
fscanf(fp, "%s", list[ID].address);
|
108
|
+
fscanf(fp, "%s", list[ID].tel);
|
63
109
|
printf("名前:%s\n",list[ID].name);
|
64
110
|
printf("郵便番号:%s\n",list[ID].zipcode);
|
65
111
|
printf("住所:%s\n",list[ID].address);
|
@@ -67,15 +113,21 @@
|
|
67
113
|
}
|
68
114
|
|
69
115
|
//名前・郵便番号・住所・電話番号の登録
|
70
|
-
void Register(InfoList list){
|
116
|
+
void Register(InfoList list, FILE *fp){
|
117
|
+
fp = fopen("memo.txt", "a");
|
71
118
|
printf("登録したい");
|
72
119
|
int ID = InputID();
|
73
120
|
InputInfo(&list[ID]);
|
121
|
+
fprintf(fp, "%s", list[ID].name);
|
122
|
+
fprintf(fp, "%s", list[ID].zipcode);
|
123
|
+
fprintf(fp, "%s", list[ID].address);
|
124
|
+
fprintf(fp, "%s\n", list[ID].tel);
|
74
125
|
printf("登録に成功しました。\n");
|
75
126
|
}
|
76
127
|
|
77
128
|
//個人情報の検索
|
78
|
-
void Search(InfoList list){
|
129
|
+
void Search(InfoList list, FILE *fp){
|
130
|
+
fp = fopen("memo.txt", "r");
|
79
131
|
int select, ID;
|
80
132
|
char *element[] = {"", "ID", "名前", "郵便番号", "住所", "電話番号"};
|
81
133
|
while(true){
|
@@ -87,7 +139,7 @@
|
|
87
139
|
if(select == 1){
|
88
140
|
printf("検索したい");
|
89
141
|
ID = InputID();
|
90
|
-
OutputInfo(list, ID);
|
142
|
+
OutputInfo(list, ID, fp);
|
91
143
|
return;
|
92
144
|
}
|
93
145
|
printf("検索する%sを入力して下さい。\n", element[select]);
|
@@ -104,7 +156,7 @@
|
|
104
156
|
default: break;
|
105
157
|
}
|
106
158
|
if(strcmp(field, target) == 0){
|
107
|
-
OutputInfo(list, ID);
|
159
|
+
OutputInfo(list, ID, fp);
|
108
160
|
found = true;
|
109
161
|
}
|
110
162
|
}
|
@@ -112,12 +164,17 @@
|
|
112
164
|
}
|
113
165
|
|
114
166
|
//全データの閲覧
|
115
|
-
void ListAll(InfoList list){
|
167
|
+
void ListAll(InfoList list, FILE *fp){
|
168
|
+
fp = fopen("memo.txt", "r");
|
116
169
|
int ID;
|
117
170
|
for(ID=1; ID<=SIZE; ID++){
|
171
|
+
fscanf(fp, "%s", list[ID].name);
|
172
|
+
fscanf(fp, "%s", list[ID].zipcode);
|
173
|
+
fscanf(fp, "%s", list[ID].address);
|
174
|
+
fscanf(fp, "%s", list[ID].tel);
|
118
175
|
if(list[ID].name[0] == '\0') continue;
|
119
176
|
printf("-------------------------------\n");
|
120
|
-
OutputInfo(list, ID);
|
177
|
+
OutputInfo(list, ID, fp);
|
121
178
|
}
|
122
179
|
}
|
123
180
|
|
@@ -127,7 +184,8 @@
|
|
127
184
|
}
|
128
185
|
|
129
186
|
//データの削除
|
130
|
-
void Delete(InfoList list){
|
187
|
+
void Delete(InfoList list, FILE *fp){
|
188
|
+
fp = fopen("memo.txt", "a");
|
131
189
|
printf("削除したいデータの");
|
132
190
|
int ID = InputID();
|
133
191
|
printf("データを削除しますか? 1.yes 2.no\n");
|
@@ -135,6 +193,7 @@
|
|
135
193
|
int select = 0;
|
136
194
|
if(scanf("%d", &select) != 1) exit(1);
|
137
195
|
if(select == 1){
|
196
|
+
fscanf(fp, "%s", list[ID]);
|
138
197
|
Clear(&list[ID]);
|
139
198
|
printf("データを削除しました。\n");
|
140
199
|
return;
|
@@ -148,6 +207,7 @@
|
|
148
207
|
|
149
208
|
//メインメニュー
|
150
209
|
int main(){
|
210
|
+
FILE *fp;
|
151
211
|
InfoList list;
|
152
212
|
int MenuID = 0;
|
153
213
|
while(MenuID != 5){
|
@@ -161,21 +221,21 @@
|
|
161
221
|
if(scanf("%d", &MenuID) != 1) exit(1);
|
162
222
|
system("cls");
|
163
223
|
switch(MenuID){
|
164
|
-
case 1: Register(list); break;
|
224
|
+
case 1: Register(list, fp); break;
|
165
|
-
case 2: Search(list); break;
|
225
|
+
case 2: Search(list, fp); break;
|
166
|
-
case 3: ListAll(list); break;
|
226
|
+
case 3: ListAll(list, fp); break;
|
167
|
-
case 4: Delete(list); break;
|
227
|
+
case 4: Delete(list, fp); break;
|
168
228
|
case 5: return 0;
|
169
229
|
default: printf("不正な番号です。再入力して下さい。\n"); break;
|
170
230
|
}
|
171
231
|
}
|
232
|
+
fclose(fp);
|
172
233
|
}
|
173
234
|
|
174
235
|
```
|
175
236
|
###回答していただきたいこと
|
176
|
-
・上記ソースコードの修正版
|
177
|
-
・
|
237
|
+
・ターミナルに上記のように正しく表示する方法
|
178
|
-
|
238
|
+
・何が間違っているから文字列が正しく表示されないのか
|
179
239
|
|
180
240
|
### 補足情報
|
181
241
|
|