こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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は認識されます。

投稿日時 - 2009-11-28 19:40:48

QNo.5483040

困ってます

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

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

投稿日時 - 2009-11-29 11:39:46

お礼

回答ありがとうございました。
以下のコードに直すことで、正常な動作になりました。

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();
 }
}

本当にありがとうございました!

投稿日時 - 2009-11-29 15:46:29

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

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

投稿日時 - 2009-11-29 06:12:20

補足

回答ありがとうございます。

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

投稿日時 - 2009-11-29 08:07:36

お礼

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

投稿日時 - 2009-11-29 15:48:48

あなたにオススメの質問