質問編集履歴

1

codeにソースを記載しました。ご指摘ありがとうございます。

2020/09/01 13:18

投稿

tamatamagoo
tamatamagoo

スコア2

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,265 @@
1
+ ``````C++
2
+
3
+ include <stdio.h>
4
+
5
+ include <stdlib.h>
6
+
7
+ include <string.h>
8
+
9
+ include <dirent.h>
10
+
11
+ include <iostream>
12
+
13
+ using namespace std;
14
+
15
+
16
+
17
+ struct record{
18
+
19
+   char* class;
20
+
21
+ char* name;
22
+
23
+ char* number;
24
+
25
+ char* title;
26
+
27
+ char* kind;
28
+
29
+ char* message;
30
+
31
+ };
32
+
33
+
34
+
35
+ struct record2{
36
+
37
+   char* class2;
38
+
39
+ char* name2;
40
+
41
+ char* number2;
42
+
43
+ char* title2;
44
+
45
+ char* kind2;
46
+
47
+ char* message2;
48
+
49
+ };
50
+
51
+
52
+
53
+ int filter(const struct *fl){
54
+
55
+ const char *p=strrchr(fl->d_name,'.');
56
+
57
+ return p && !strcasecmp(p,".INI");
58
+
59
+ }
60
+
61
+
62
+
63
+ int main(int argc,char *argv[]{
64
+
65
+
66
+
67
+ if(argc !=2){
68
+
69
+ cout<<"引数にディレクトリを指定してください"<<endl;
70
+
71
+ return 1;
72
+
73
+ }
74
+
75
+
76
+
77
+ FILE *input_fp;
78
+
79
+ FILE *output_fp;
80
+
81
+ char* input_file;
82
+
83
+ char* output_file;
84
+
85
+ char* dir; //読み込みファイルまでのパスのアドレス
86
+
87
+ char* fileName;
88
+
89
+
90
+
91
+ output_fp=fopen("class.csv","wb"); //出力ファイル読み込み
92
+
93
+
94
+
95
+ if(output_fp==NULL){
96
+
97
+ cout<<"ファイルオープンできませんでした"<<endl;
98
+
99
+ }
100
+
101
+
102
+
103
+ char file_list[64]; //.INIファイルのみを入れる配列(後にコピーをする際にchar*型が必要と感じたので入れています)
104
+
105
+ char* pl;
106
+
107
+ file_list=pl;
108
+
109
+
110
+
111
+ struct dirent **fileList; //filter関数で使う
112
+
113
+
114
+
115
+ record rcd;
116
+
117
+ record2 rcd2; //構造体
118
+
119
+
120
+
121
+ record r1[256];      //構造体配列の生成
122
+
123
+ struct record *sr;
124
+
125
+ sr=r1;
126
+
127
+
128
+
129
+ record r2[256];
130
+
131
+ struct record2 *sr2;
132
+
133
+ sr2=r2;
134
+
135
+
136
+
137
+ char* pcw;
138
+
139
+ char* pcs; //指定文字のポインタを格納するもの
140
+
141
+
142
+
143
+ char val[256]; //一列読み込んだものを一時的に格納する配列
144
+
145
+ char* p1;
146
+
147
+ p1=val;
148
+
149
+
150
+
151
+ int n=scandir(argv[1],&fileList,filter,NULL){
152
+
153
+
154
+
155
+ if(n<0){
156
+
157
+ perror("scandir");
158
+
159
+ return 2;
160
+
161
+ }
162
+
163
+
164
+
165
+ if(n>0){
166
+
167
+ for(int i=0;i<n;i++){
168
+
169
+ pl=fileList[i]->d_name; //抽出したファイルを配列に格納
170
+
171
+ dir=argv[1];                  //引数のディレクトリ(対象ファイルがこのディレクトリ内にあるため)
172
+
173
+
174
+
175
+ strcat(input_file,dir);
176
+
177
+ strcat(input_file,"/");
178
+
179
+ strcat(input_file,pl);
180
+
181
+
182
+
183
+ input_fp=fopen(input_file,"rb");
184
+
185
+
186
+
187
+ if(input_fp==NULL){
188
+
189
+ cout<<"ファイルオープンできませんでした。"<<endl;
190
+
191
+ }
192
+
193
+
194
+
195
+ while(!feof(input_fp)){
196
+
197
+ memset((char*)sr,'\0',sizeof(r1));
198
+
199
+ memset((char*)sr2,'\0',sizeof(r2));
200
+
201
+ memset(p1,'\0',sizeof(val));
202
+
203
+
204
+
205
+ pcw=NULL;
206
+
207
+ pcs=NULL;
208
+
209
+
210
+
211
+ strcpy((char*)sr,pl);
212
+
213
+
214
+
215
+ fgets(pl,sizeof(val),input_fp);
216
+
217
+
218
+
219
+ pcw=strstr(p1,"[");
220
+
221
+ pcs=strstr(p1,"]");
222
+
223
+
224
+
225
+ *pcs='\0';
226
+
227
+
228
+
229
+ strcpy((char*)sr,pcw+1);
230
+
231
+
232
+
233
+ fwrite(&rcd,sizeof(record),1,output_fo);
234
+
235
+
236
+
237
+ }
238
+
239
+ }
240
+
241
+
242
+
243
+ }
244
+
245
+
246
+
247
+ }
248
+
249
+
250
+
251
+ 上記まで書き、一度試してみようと思い実行したところできませんでした。
252
+
253
+
254
+
255
+ この後の展開もわからず壁にぶつかっている状況ですのでヒントを頂けたらと思い質問しました。
256
+
257
+
258
+
259
+ ご回答よろしくお願いいたします。
260
+
261
+ ```
262
+
1
263
  行いたいこと:構造体を利用したファイル入出力
2
264
 
3
265
 
@@ -47,349 +309,3 @@
47
309
 
48
310
 
49
311
  開発環境はLinuxです。
50
-
51
-
52
-
53
- =========================ソース======================================
54
-
55
-
56
-
57
-
58
-
59
- #include <stdio.h>
60
-
61
- #include <stdlib.h>
62
-
63
- #include <string.h>
64
-
65
- #include <dirent.h>
66
-
67
- #include <iostream>
68
-
69
-
70
-
71
- using namespace std;
72
-
73
-
74
-
75
- struct record{
76
-
77
-     
78
-
79
-  char* class;
80
-
81
-      char* name;
82
-
83
- char* number;
84
-
85
- char* title;
86
-
87
- char* kind;
88
-
89
- char* message;
90
-
91
- };
92
-
93
-
94
-
95
- struct record2{
96
-
97
-     
98
-
99
-  char* class2;
100
-
101
-  char* name2;
102
-
103
- char* number2;
104
-
105
- char* title2;
106
-
107
- char* kind2;
108
-
109
- char* message2;
110
-
111
- };
112
-
113
-
114
-
115
- int filter(const struct *fl){
116
-
117
-
118
-
119
- const char *p=strrchr(fl->d_name,'.');
120
-
121
- return p && !strcasecmp(p,".INI");
122
-
123
-
124
-
125
- }
126
-
127
-
128
-
129
- int main(int argc,char *argv[]{
130
-
131
-
132
-
133
- if(argc !=2){
134
-
135
-
136
-
137
- cout<<"引数にディレクトリを指定してください"<<endl;
138
-
139
- return 1;
140
-
141
-
142
-
143
- }
144
-
145
-
146
-
147
- FILE *input_fp;
148
-
149
- FILE *output_fp;
150
-
151
- char* input_file;
152
-
153
- char* output_file;
154
-
155
- char* dir; //読み込みファイルまでのパスのアドレス
156
-
157
- char* fileName;
158
-
159
-
160
-
161
- output_fp=fopen("class.csv","wb"); //出力ファイル読み込み
162
-
163
-
164
-
165
- if(output_fp==NULL){
166
-
167
-
168
-
169
- cout<<"ファイルオープンできませんでした"<<endl;
170
-
171
-
172
-
173
- }
174
-
175
-
176
-
177
- char file_list[64]; //.INIファイルのみを入れる配列(後にコピーをする際にchar*型が必要と感じたので入れています)
178
-
179
- char* pl;
180
-
181
- file_list=pl;
182
-
183
-
184
-
185
- struct dirent **fileList; //filter関数で使う
186
-
187
-
188
-
189
- record rcd;
190
-
191
- record2 rcd2; //構造体
192
-
193
-
194
-
195
- record r1[256];      //構造体配列の生成
196
-
197
- struct record *sr;
198
-
199
- sr=r1;
200
-
201
-
202
-
203
- record r2[256];
204
-
205
- struct record2 *sr2;
206
-
207
- sr2=r2;
208
-
209
-
210
-
211
- char* pcw;
212
-
213
- char* pcs; //指定文字のポインタを格納するもの
214
-
215
-
216
-
217
- char val[256]; //一列読み込んだものを一時的に格納する配列
218
-
219
- char* p1;
220
-
221
- p1=val;
222
-
223
-
224
-
225
-
226
-
227
- int n=scandir(argv[1],&fileList,filter,NULL){
228
-
229
-
230
-
231
- if(n<0){
232
-
233
-
234
-
235
- perror("scandir");
236
-
237
- return 2;
238
-
239
-
240
-
241
- }
242
-
243
-
244
-
245
- if(n>0){
246
-
247
-
248
-
249
- for(int i=0;i<n;i++){
250
-
251
-
252
-
253
- pl=fileList[i]->d_name; //抽出したファイルを配列に格納
254
-
255
- dir=argv[1];                  //引数のディレクトリ(対象ファイルがこのディレクトリ内にあるため)
256
-
257
-
258
-
259
- strcat(input_file,dir);
260
-
261
- strcat(input_file,"/");
262
-
263
- strcat(input_file,pl);
264
-
265
-
266
-
267
- input_fp=fopen(input_file,"rb");
268
-
269
-
270
-
271
- if(input_fp==NULL){
272
-
273
-
274
-
275
- cout<<"ファイルオープンできませんでした。"<<endl;
276
-
277
-
278
-
279
- }
280
-
281
-
282
-
283
- while(!feof(input_fp)){
284
-
285
-
286
-
287
- memset((char*)sr,'\0',sizeof(r1));
288
-
289
- memset((char*)sr2,'\0',sizeof(r2));
290
-
291
- memset(p1,'\0',sizeof(val));
292
-
293
-
294
-
295
-
296
-
297
- pcw=NULL;
298
-
299
- pcs=NULL;
300
-
301
-
302
-
303
- strcpy((char*)sr,pl);
304
-
305
-
306
-
307
- fgets(pl,sizeof(val),input_fp);
308
-
309
-
310
-
311
- pcw=strstr(p1,"[");
312
-
313
- pcs=strstr(p1,"]");
314
-
315
-
316
-
317
- *pcs='\0';
318
-
319
-
320
-
321
- strcpy((char*)sr,pcw+1);
322
-
323
-
324
-
325
-
326
-
327
-
328
-
329
- fwrite(&rcd,sizeof(record),1,output_fo);
330
-
331
-
332
-
333
-
334
-
335
- }
336
-
337
- }
338
-
339
-
340
-
341
- }
342
-
343
-
344
-
345
- }
346
-
347
-
348
-
349
-
350
-
351
-
352
-
353
-
354
-
355
-
356
-
357
-
358
-
359
-
360
-
361
-
362
-
363
-
364
-
365
-
366
-
367
-
368
-
369
-
370
-
371
-
372
-
373
-
374
-
375
-
376
-
377
-
378
-
379
-
380
-
381
-
382
-
383
-
384
-
385
-
386
-
387
- 上記まで書き、一度試してみようと思い実行したところできませんでした。
388
-
389
-
390
-
391
- この後の展開もわからず壁にぶつかっている状況ですのでヒントを頂けたらと思い質問しました。
392
-
393
-
394
-
395
- ご回答よろしくお願いいたします。