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

質問編集履歴

1

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

2020/09/01 13:18

投稿

tamatamagoo
tamatamagoo

スコア2

title CHANGED
File without changes
body CHANGED
@@ -1,91 +1,54 @@
1
- 行いたいこと:構造体を利用したファイル入出力
2
-
3
- フォルダ内にあるテキストファイル(.INI)を読み込み、別の拡張子(.csv)として出力するツールを作成しています。
4
-
5
-
6
- 現在、下記のソースを実行するとメモリをセットした段階でコアダンプになってしまいます。
7
-
8
- ◎今回質問したいこと
9
- 1.ファイルを読み込み→構造体変数に入れるにはどうしたらよいか
10
- 2.ファイル内に同じタイトルのものがありそれぞれ値を格納したいときはどのようにすればよいか
11
- (例)[Aクラス]
1
+ ``````C++
12
- 名前:山田|田中           (イメージ図)  クラス 名前 ID タイトル ジャンル メッセージ
13
- ID:123|234                       A   山田  123 こんにちは 冒険  ぜひ読んで
14
- タイトル:こんにちは|こんばんは →          A   田中  234 こんばんは ヒューマン 楽しんで
15
- ジャンル:冒険|ヒューマン                           ・
16
- メッセージ:ぜひ読んで|楽しんで                        ・
17
-
18
- 上記の例はAクラスに山田さんと田中さんがおり、同一クラスの人たちの情報はまとめて記述されているというものです。
19
- こういった場合どのようにすればよいのかわかりません。
20
-
21
- 3.なぜコアダンプになってしまうのか
22
-
23
- *構造体の変数は型以外変えています。ご了承ください。
24
-
25
- 開発環境はLinuxです。
26
-
27
- =========================ソース======================================
28
-
29
-
30
- #include <stdio.h>
2
+ include <stdio.h>
31
- #include <stdlib.h>
3
+ include <stdlib.h>
32
- #include <string.h>
4
+ include <string.h>
33
- #include <dirent.h>
5
+ include <dirent.h>
34
- #include <iostream>
6
+ include <iostream>
35
-
36
7
  using namespace std;
37
8
 
38
9
  struct record{
39
-     
40
-  char* class;
10
+   char* class;
41
-      char* name;
11
+ char* name;
42
- char* number;
12
+ char* number;
43
- char* title;
13
+ char* title;
44
- char* kind;
14
+ char* kind;
45
- char* message;
15
+ char* message;
46
16
  };
47
17
 
48
18
  struct record2{
49
-     
50
-  char* class2;
19
+   char* class2;
51
-  char* name2;
20
+ char* name2;
52
- char* number2;
21
+ char* number2;
53
- char* title2;
22
+ char* title2;
54
- char* kind2;
23
+ char* kind2;
55
- char* message2;
24
+ char* message2;
56
25
  };
57
26
 
58
27
  int filter(const struct *fl){
59
-
60
- const char *p=strrchr(fl->d_name,'.');
28
+ const char *p=strrchr(fl->d_name,'.');
61
- return p && !strcasecmp(p,".INI");
29
+ return p && !strcasecmp(p,".INI");
62
-
63
30
  }
64
31
 
65
32
  int main(int argc,char *argv[]{
66
-
67
- if(argc !=2){
68
-
69
- cout<<"引数にディレクトリを指定してください"<<endl;
70
- return 1;
71
33
 
34
+ if(argc !=2){
35
+ cout<<"引数にディレクトリを指定してください"<<endl;
36
+ return 1;
72
- }
37
+ }
73
38
 
74
- FILE *input_fp;
39
+ FILE *input_fp;
75
- FILE *output_fp;
40
+ FILE *output_fp;
76
- char* input_file;
41
+ char* input_file;
77
- char* output_file;
42
+ char* output_file;
78
- char* dir; //読み込みファイルまでのパスのアドレス
43
+ char* dir; //読み込みファイルまでのパスのアドレス
79
- char* fileName;
44
+ char* fileName;
80
-
81
- output_fp=fopen("class.csv","wb"); //出力ファイル読み込み
82
45
 
46
+ output_fp=fopen("class.csv","wb"); //出力ファイル読み込み
47
+
83
- if(output_fp==NULL){
48
+ if(output_fp==NULL){
84
-
85
49
  cout<<"ファイルオープンできませんでした"<<endl;
50
+ }
86
51
 
87
- }
88
-
89
52
  char file_list[64]; //.INIファイルのみを入れる配列(後にコピーをする際にchar*型が必要と感じたので入れています)
90
53
  char* pl;
91
54
  file_list=pl;
@@ -110,89 +73,84 @@
110
73
  char* p1;
111
74
  p1=val;
112
75
 
113
-
114
76
  int n=scandir(argv[1],&fileList,filter,NULL){
115
77
 
116
78
  if(n<0){
117
-
118
- perror("scandir");
79
+ perror("scandir");
119
- return 2;
80
+ return 2;
120
-
121
81
  }
122
82
 
123
83
  if(n>0){
84
+ for(int i=0;i<n;i++){
85
+ pl=fileList[i]->d_name; //抽出したファイルを配列に格納
86
+ dir=argv[1];                  //引数のディレクトリ(対象ファイルがこのディレクトリ内にあるため)
124
87
 
125
- for(int i=0;i<n;i++){
88
+ strcat(input_file,dir);
89
+ strcat(input_file,"/");
90
+ strcat(input_file,pl);
126
91
 
127
- pl=fileList[i]->d_name; //抽出したファイルを配列に格納
92
+ input_fp=fopen(input_file,"rb");
128
- dir=argv[1];                  //引数のディレクトリ(対象ファイルがこのディレクトリ内にあるため)
129
93
 
130
- strcat(input_file,dir);
94
+ if(input_fp==NULL){
131
- strcat(input_file,"/");
95
+ cout<<"ファイルオープンできませんでした。"<<endl;
132
- strcat(input_file,pl);
96
+ }
133
97
 
98
+ while(!feof(input_fp)){
99
+ memset((char*)sr,'\0',sizeof(r1));
134
- input_fp=fopen(input_file,"rb");
100
+ memset((char*)sr2,'\0',sizeof(r2));
101
+ memset(p1,'\0',sizeof(val));
135
102
 
136
- if(input_fp==NULL){
103
+ pcw=NULL;
104
+ pcs=NULL;
137
105
 
138
- cout<<"ファイルオープンできませんでした。"<<endl;
106
+ strcpy((char*)sr,pl);
139
107
 
140
- }
108
+ fgets(pl,sizeof(val),input_fp);
141
109
 
142
- while(!feof(input_fp)){
110
+ pcw=strstr(p1,"[");
111
+ pcs=strstr(p1,"]");
143
112
 
144
- memset((char*)sr,'\0',sizeof(r1));
145
- memset((char*)sr2,'\0',sizeof(r2));
146
- memset(p1,'\0',sizeof(val));
113
+ *pcs='\0';
147
114
 
115
+ strcpy((char*)sr,pcw+1);
148
116
 
149
- pcw=NULL;
150
- pcs=NULL;
117
+ fwrite(&rcd,sizeof(record),1,output_fo);
151
118
 
152
- strcpy((char*)sr,pl);
119
+ }
120
+ }
153
121
 
154
- fgets(pl,sizeof(val),input_fp);
122
+ }
155
123
 
156
- pcw=strstr(p1,"[");
157
- pcs=strstr(p1,"]");
158
-
159
- *pcs='\0';
160
-
161
- strcpy((char*)sr,pcw+1);
162
-
163
-
164
-
165
- fwrite(&rcd,sizeof(record),1,output_fo);
166
-
167
-
168
124
  }
169
- }
170
125
 
171
- }
126
+ 上記まで書き、一度試してみようと思い実行したところできませんでした。
172
127
 
173
- }
128
+ この後の展開もわからず壁にぶつかっている状況ですのでヒントを頂けたらと思い質問しました。
174
129
 
130
+ ご回答よろしくお願いいたします。
131
+ ```
132
+ 行いたいこと:構造体を利用したファイル入出力
175
133
 
134
+ フォルダ内にあるテキストファイル(.INI)を読み込み、別の拡張子(.csv)として出力するツールを作成しています。
176
135
 
177
136
 
137
+ 現在、下記のソースを実行するとメモリをセットした段階でコアダンプになってしまいます。
178
138
 
139
+ ◎今回質問したいこと
140
+ 1.ファイルを読み込み→構造体変数に入れるにはどうしたらよいか
141
+ 2.ファイル内に同じタイトルのものがありそれぞれ値を格納したいときはどのようにすればよいか
142
+ (例)[Aクラス]
143
+ 名前:山田|田中           (イメージ図)  クラス 名前 ID タイトル ジャンル メッセージ
144
+ ID:123|234                       A   山田  123 こんにちは 冒険  ぜひ読んで
145
+ タイトル:こんにちは|こんばんは →          A   田中  234 こんばんは ヒューマン 楽しんで
146
+ ジャンル:冒険|ヒューマン                           ・
147
+ メッセージ:ぜひ読んで|楽しんで                        ・
179
148
 
149
+ 上記の例はAクラスに山田さんと田中さんがおり、同一クラスの人たちの情報はまとめて記述されているというものです。
150
+ こういった場合どのようにすればよいのかわかりません。
180
151
 
152
+ 3.なぜコアダンプになってしまうのか
181
153
 
154
+ *構造体の変数は型以外変えています。ご了承ください。
182
155
 
183
-
184
-
185
-
186
-
187
-
188
-
189
-
190
-
191
-
192
-
193
-
194
- 上記まで書き、一度試してみようと思い実行したところできませんでした。
195
-
196
- この後の展開もわからず壁にぶつかっている状況ですのでヒントを頂けたらと思い質問しました。
197
-
198
- ご回答よろしくお願いいたします。
156
+ 開発環境はLinuxです。