重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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

A 回答 (2件)

「セーブデータが読み込めなかったとき」にオープンした ifstream をそのままにして同じファイルを ofstream でオープ

ンしてるってのが気になる. ostrm をオープンする前に istrm をクローズするのが普通じゃないかな.
    • good
    • 0
この回答へのお礼

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

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

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

この回答への補足

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

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

補足日時:2009/11/29 08:07
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/29 15:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!