初心者です。
DXライブラリを用いてゲーム制作を行っているのですが、テキストファイルのデータを入出力する際に例外処理が発生してプログラムが止まってしまいます。
以下の2つの関数のどちらか、または両方に発生している事までは分かりました。
それでお聞きしたい事があるのですが、
@この2つの関数の内容のどこが間違っているのでしょうか。ビルドはできます。
Aこの関数で実行すると、文字列が記録されず初期値のままです。でもこのやり方しかわかりません。他の文字列の正しいread,writeの仕方を教えてください。
//イベントファイルを読み込む。何も値が無い場合は初期値
int load_EventFile(int w, int h, char *eventfile) {
string::size_type strlen;//明示的にsizeof()の値が入る変数であることを示した型
e_map.resize(w*h);
ifstream in(eventfile);
if (!in) {
printfDx("%sが開けません",eventfile);
ScreenFlip();
WaitKey();
return 1;//txtファイルが存在しなかったらe_mapを初期化して返す
}
for (int j = 0; j < h; j++) {
for (int i = 0; i < w; i++) {
in.read((char*)&e_map[j*w + i].ID, sizeof(e_map[j*w + i].ID));
in.read((char*)&e_map[j*w + i].e_type, sizeof(e_map[j*w + i].e_type));
in.read((char*)&e_map[j*w + i].e_entity, sizeof(e_map[j*w + i].e_entity));
in.read((char*)&e_map[j*w + i].d.up, sizeof(e_map[j*w + i].d.up));
in.read((char*)&e_map[j*w + i].d.right, sizeof(e_map[j*w + i].d.right));
in.read((char*)&e_map[j*w + i].d.down, sizeof(e_map[j*w + i].d.down));
in.read((char*)&e_map[j*w + i].d.left, sizeof(e_map[j*w + i].d.left));
in.read((char*)&e_map[j*w + i].mnh, sizeof(e_map[j*w + i].mnh));
in.read((char*)&strlen, sizeof(strlen));//文字列のサイズを入力する
in.read(&e_map[j*w + i].str[0], strlen);//str[0]は固定,こうしないと文字列が入らない
in.read((char*)&e_map[j*w + i].item, sizeof(e_map[j*w + i].item));
in.read((char*)&e_map[j*w + i].other, sizeof(e_map[j*w + i].other));
in.read((char*)&e_map[j*w + i].center_event, sizeof(e_map[j*w + i].center_event));
for (int k = 0; i < EW_MAX; i++) {
in.read((char*)&e_map[j*w + i].ew_cr[k].color, sizeof(e_map[j*w + i].ew_cr[k].color));
}
}
}
in.close();
return 0;
}
void save_EventFile(int w, int h, char *eventfile) {
fstream out(eventfile, ios::out | ios::binary);
if (!out) {
printfDx("%sが開けません", eventfile);
ScreenFlip();
WaitKey();
exit(1);
}
string::size_type strlen;//sizeof()の値を明示的に扱う事を示した型
for (int j = 0; j < h; j++) {
for (int i = 0; i < w; i++) {
out.write((char*)&e_map[j*w + i].ID, sizeof(e_map[j*w + i].ID));
out.write((char*)&e_map[j*w + i].e_type, sizeof(e_map[j*w + i].e_type));
out.write((char*)&e_map[j*w + i].e_entity, sizeof(e_map[j*w + i].e_entity));
out.write((char*)&e_map[j*w + i].d.up, sizeof(e_map[j*w + i].d.up));
out.write((char*)&e_map[j*w + i].d.right, sizeof(e_map[j*w + i].d.right));
out.write((char*)&e_map[j*w + i].d.down, sizeof(e_map[j*w + i].d.down));
out.write((char*)&e_map[j*w + i].d.left, sizeof(e_map[j*w + i].d.left));
out.write((char*)&e_map[j*w + i].mnh, sizeof(e_map[j*w + i].mnh));
strlen = e_map[j*w + i].str.size();
out.write((char*)&strlen, sizeof(strlen));//文字列のサイズを入力する
out.write(e_map[j*w + i].str.c_str(), strlen);
out.write((char*)&e_map[j*w + i].item, sizeof(e_map[j*w + i].item));
out.write((char*)&e_map[j*w + i].other, sizeof(e_map[j*w + i].other));
out.write((char*)&e_map[j*w + i].center_event, sizeof(e_map[j*w + i].center_event));
for (int k = 0; k < EW_MAX; k++) {
out.write((char*)&e_map[j*w + i].ew_cr[k].color, sizeof(e_map[j*w + i].ew_cr[k].color));
}
}
}
out.close();
}