トップページ > 記事閲覧
独自クラスを用いたvectorのread,writeの使用方法について
名前:たないち 日時: 2020/09/08 19:20

初心者です。 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(); }
メンテ

Page: 1 |

Re: 独自クラスを用いたvectorのread,writeの使用方法について ( No.1 )
名前:たないち 日時:2020/09/08 19:43

追記です。上のものだけでは不十分だと思ったので。 //イベントモードで使うenum enum Event_Window { EW_TYPE, EW_ENTITY, EW_ITEM, EW_TALK, EW_OTHER, EW_TYPE_NOTHING, EW_TYPE_FINITY, EW_TYPE_INFINITY, EW_ENTITY_NOTHING, EW_ENTITY_EXIST, EW_ITEM_OFF, EW_ITEM_ON, EW_TALK_SELECT, EW_OTHER_OFF, EW_OTHER_ON, EW_MAX } //向き class direction { public: char up; char right; char down; char left; }; //イベントモードで使う色 class Ew_Color { public: unsigned int color = GetColor(255, 255, 255); }; //イベントモードで使用するクラス class event { public: int ID = -1; char e_type = -1;//イベントの種類 char e_entity = -1;//イベントのマスに移動できるかどうか class direction d;//イベントのマスの上下左右からの向き enum Enum_MapNumber mnh;//マップの番号を表すenum string str = "";//会話文、コメント char item = -1;//アイテム char other = -1;//その他の処理が必要かどうか int center_event;//親イベントのID class Ew_Color ew_cr[EW_MAX];//色 }; vector<event> e_map;
メンテ
Re: 独自クラスを用いたvectorのread,writeの使用方法について ( No.2 )
名前:管理人 日時:2020/09/10 02:52

実行はしていませんが、コードを拝見する限りでは何か間違いがあるようには見えません… save_EventFile を実行した後、ファイルは問題なく作成されていますでしょうか?
メンテ
Re: 独自クラスを用いたvectorのread,writeの使用方法について ( No.3 )
名前:たないち 日時:2020/09/10 18:48

確認した所、ファイルは作成されているんですがファイルへ値が何も出力されておらず、白紙のままでした。 調べてみたら、例外処理がされるまではtxtファイルに記録されるのですが、例外処理が起こるとtxtファイルは白紙になりました。 ただ、例外処理になる原因があるから白紙になるのだと思いますが、原因が全くわかりません。
メンテ
Re: 独自クラスを用いたvectorのread,writeの使用方法について ( No.4 )
名前:たないち(解決) 日時:2020/09/10 19:37

ようやく分かりました。 load_EventFileのe_map[j*w+i].ew_cr[k].colorのfor文でfor(int k=0;i<EW_MAX;i++)としていました。 単なる記述ミスでした。(^^;)
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存