• ベストアンサー

iostreamの挙動について

//save.h class c_save{  ofstream ostrm;  ifstream istrm; public:  void read(int *point);  void write(int *point); }; //save.cpp void c_save::read(int *point){  istrm.open("savedata.sav",ios::in | ios::binary);  if(!istrm){   MessageBox(NULL,L"セーブデータが読み込めませんでした。\n新規セーブデータを作成します。",L"セーブデータの作成",MB_OK);   ostrm.open("savedata.sav",ios::out | ios::trunc | ios::binary);   if(!ostrm){    MessageBox(NULL,L"新規セーブデータの作成に失敗しました。",L"セーブデータの作成",MB_OK);   }   else{    *point = 0;    ostrm.write((char *)point,sizeof(int));   }   ostrm.close();  }  else{  istrm.read((char *)point,sizeof(int));  }  istrm.close(); } void c_save::write(int *point){  ostrm.open("savedata.sav",ios::out | ios::trunc | ios::binary);  if(!ostrm){   MessageBox(NULL,L"セーブデータの書き込みに失敗しました。",L"セーブデータの書き込み",MB_OK);  }  else{   ostrm.write((char *)point,sizeof(int));  }  ostrm.close(); } ゲーム用に、ポイントを記録するために上記のようなクラスを作成したのですが、read関数を呼び出し、その後write関数を呼び出し、その次にまたread関数を呼び出すと、read関数で2回ともセーブデータが読み込めませんというメッセージがでてしまいます。 一度目のread関数でsavedata.savは作成されているのにもかかわらず、二度目でも読み込めないのはなぜでしょうか? ちなみに、アプリケーションを再起動させるとsavedata.savは認識されます。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「セーブデータが読み込めなかったとき」にオープンした ifstream をそのままにして同じファイルを ofstream でオープンしてるってのが気になる. ostrm をオープンする前に istrm をクローズするのが普通じゃないかな.

ahys
質問者

お礼

回答ありがとうございました。 以下のコードに直すことで、正常な動作になりました。 void c_save::read(int *point){  istrm.open("savedata.sav",ios::in | ios::binary);  if(!istrm){   istrm.close();   MessageBox(NULL,L"セーブデータが読み込めませんでした。\n新規セーブデータを作成します。",L"セーブデータの作成",MB_OK);   ostrm.open("savedata.sav",ios::out | ios::trunc | ios::binary);   if(!ostrm){    MessageBox(NULL,L"新規セーブデータの作成に失敗しました。",L"セーブデータの作成",MB_OK);   }   else{    *point = 0;    ostrm.write((char *)point,sizeof(int));    ostrm.flush();   }   ostrm.close();  }  else{   istrm.read((char *)point,sizeof(int));   istrm.close();  } } 本当にありがとうございました!

その他の回答 (1)

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.1

flushしてやれば良い、つーかflushされてないからWriteデータがデバイスに書き込まれてないんだと思いますが。

ahys
質問者

お礼

上の回答者の指摘で正常な動作になりましたので、締め切らせていただきます。

ahys
質問者

補足

回答ありがとうございます。 2か所の ostrm.write((char *)point,sizeof(int)); のコードの下に ostrm.flush(); を追加したのですが、効果がありませんでした。 実際にフォルダ内にsavedata.savがwriteのタイミングで作成されるので、書き込まれていると思うのですがどうでしょうか? また、flushを調べてみましたがあまり使い方がわからず、誤った使い方になっているかもしれません。 どうか、詳しい回答をいただけないでしょうか?

関連するQ&A