回答編集履歴

3

追記3

2021/06/11 12:07

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -153,3 +153,85 @@
153
153
 
154
154
 
155
155
  とにかく、どんなふうにデバッグしているかを教えてください。
156
+
157
+
158
+
159
+ **追記3**
160
+
161
+ ```C++
162
+
163
+ class Table {
164
+
165
+ friend Record;
166
+
167
+ std::vector<Record> v;
168
+
169
+ public:
170
+
171
+ void add(Record r) { v.push_back(r); }
172
+
173
+ ...
174
+
175
+ };
176
+
177
+
178
+
179
+ #include <sstream> // istringstream
180
+
181
+
182
+
183
+ std::vector<std::string> split(std::string s)
184
+
185
+ {
186
+
187
+ std::vector<std::string> v;
188
+
189
+ std::istringstream iss(s);
190
+
191
+ std::string t;
192
+
193
+ while (iss >> t) v.push_back(t);
194
+
195
+ return v;
196
+
197
+ }
198
+
199
+
200
+
201
+ void import(std::ifstream & fin, Table & table)
202
+
203
+ {
204
+
205
+ while (true) {
206
+
207
+ Record record;
208
+
209
+ std::string s;
210
+
211
+ if (!getline(fin, s)) break;
212
+
213
+ record.set_r(s);
214
+
215
+ if (!getline(fin, s)) break;
216
+
217
+ record.set_n(s);
218
+
219
+ if (!getline(fin, s)) break;
220
+
221
+ record.set_s(split(s));
222
+
223
+ if (!getline(fin, s)) break;
224
+
225
+ record.set_a(split(s));
226
+
227
+ table.add(record);
228
+
229
+ getline(fin, s);
230
+
231
+ }
232
+
233
+ }
234
+
235
+ ```
236
+
237
+ どんなふうにデバッグしているかを教えてください。

2

デバッガ使ってますか?

2021/06/11 12:07

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -81,3 +81,75 @@
81
81
  getline(fin, blank);
82
82
 
83
83
  で思い通りに読み込めます。
84
+
85
+
86
+
87
+ **追記2**
88
+
89
+ どんなふうにデバッグしているか教えてください。
90
+
91
+
92
+
93
+ どこで Segmentation falut しているか、
94
+
95
+ デバッガを使っているのなら、すぐに分かります。
96
+
97
+
98
+
99
+ デバッガを使えないなら、次のようにすれば、範囲を絞れます。
100
+
101
+ ```C++
102
+
103
+ import(fin,table);
104
+
105
+ std::cout << "import done\n";
106
+
107
+ table.print();
108
+
109
+ std::cout << "print done\n";
110
+
111
+ table.sort();
112
+
113
+ std::cout << "sort done\n";
114
+
115
+ table.result(fout);
116
+
117
+ return 0;
118
+
119
+ ```
120
+
121
+ 実行結果
122
+
123
+ ```text
124
+
125
+ import done
126
+
127
+ print done
128
+
129
+ Segmentation fault (core dumped)
130
+
131
+ ```
132
+
133
+ table.sort() の中で Segmentation fault していますね。
134
+
135
+ table.print() は問題ない。いや、問題大ありです。
136
+
137
+ 読み込んだものが何も表示されないなんて変です。
138
+
139
+ では、print() が間違っているのか?
140
+
141
+ そうではなくて、import() で table に何も読み込んでいないのかもしれません。
142
+
143
+ split() が正しく動いるかどうか確かめてください。
144
+
145
+ return v; の前に、
146
+
147
+ cout << "v.size() = " << v.size() << "\n";
148
+
149
+ for (auto e : v) cout << e << endl;
150
+
151
+ を入れてみてください。
152
+
153
+
154
+
155
+ とにかく、どんなふうにデバッグしているかを教えてください。

1

fin >> と getline の説明を追加

2021/06/10 14:21

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -21,3 +21,63 @@
21
21
  とにかくどこまで思い通りに行っているのか、main からステップ実行して
22
22
 
23
23
  すべての変数の値の変化を見てください。
24
+
25
+
26
+
27
+ **追記**
28
+
29
+ `ifstream fin("file.txt"); int i; double d; string s; fin >> i >> d >> s;`
30
+
31
+ とあった時、ファイルの内容が「123 4.5 abc」であれば、
32
+
33
+ i = 123、d = 4.5、s = "abc" と読み込めることは知っていますよね。
34
+
35
+
36
+
37
+ ifstream は istream から派生していて、istream の operator>> はデフォルトで
38
+
39
+ 空白文字(スペース、タブ、改行など)を読み飛ばすモードになっています。
40
+
41
+ だから「123タブ4.5改行abc」であっても同じように読み込めます。
42
+
43
+
44
+
45
+ 入力が「Yokozuna改行Hakuhou改行タブShiroboshiスペースShiroboshi改行Daieishou」だと、
46
+
47
+
48
+
49
+ `fin >> rank; fin >> name; fin >> score; fin >> aite;` で
50
+
51
+ rank = "Yokozuna"、name = "Hakuhou"、score = "Shiroboshi"、aite = "Shiroboshi" となります。
52
+
53
+ score に「タブShiroboshiスペースShiroboshi改行」の 1行を読み込ませたかったら
54
+
55
+ getline を使います。
56
+
57
+
58
+
59
+ ところが、fin >> name; のとき "Hakuhou" の次の改行がまだ入力ストリームに
60
+
61
+ 残ったままなので、getline(fin, score); ではその「改行」だけが読み込まれ、
62
+
63
+ 「改行」は削除されるので、score = "" となります。
64
+
65
+ getline(fin, blank); getline(fin, score); のようにすると、
66
+
67
+ score には 1行の文字列が入力できます。
68
+
69
+
70
+
71
+ ファイルの最初の 2行の「Yokozuna改行Hakuhou改行」にスペースがないのであれば
72
+
73
+ getline(fin, rank);
74
+
75
+ getline(fin, name);
76
+
77
+ getline(fin, score);
78
+
79
+ getline(fin, aite);
80
+
81
+ getline(fin, blank);
82
+
83
+ で思い通りに読み込めます。