
//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は認識されます。
No.2ベストアンサー
- 回答日時:
「セーブデータが読み込めなかったとき」にオープンした ifstream をそのままにして同じファイルを ofstream でオープ
ンしてるってのが気になる. ostrm をオープンする前に istrm をクローズするのが普通じゃないかな.回答ありがとうございました。
以下のコードに直すことで、正常な動作になりました。
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();
}
}
本当にありがとうございました!
No.1
- 回答日時:
flushしてやれば良い、つーかflushされてないからWriteデータがデバイスに書き込まれてないんだと思いますが。
この回答への補足
回答ありがとうございます。
2か所の
ostrm.write((char *)point,sizeof(int));
のコードの下に
ostrm.flush();
を追加したのですが、効果がありませんでした。
実際にフォルダ内にsavedata.savがwriteのタイミングで作成されるので、書き込まれていると思うのですがどうでしょうか?
また、flushを調べてみましたがあまり使い方がわからず、誤った使い方になっているかもしれません。
どうか、詳しい回答をいただけないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
IFRAME内HTML文書の表示方法に...
-
ASP C# データベースから1行取得
-
ACCESSのVBAで[Split]について
-
Listviewのデータを上から順番...
-
XMLとは?
-
アクセス2007 レポートで表示さ...
-
.NET SqlDataReader のレコー...
-
GASでスプレッドシートの一番上...
-
シーケンサで最小値を保持する
-
ExcelVBAを使って、値...
-
i=cells(Rows.Count, 1)とi=cel...
-
VB.NETで DataRow()を利用して...
-
テキストボックスのvalueとtext...
-
Excelで指定した日付から過去の...
-
表にフィルターをかけ、絞った...
-
iniファイルのキーと値を取得す...
-
Datatableへの代入
-
[エクセル]連続する指定範囲か...
-
値を返さないコード パス
-
エクセル関数で記号から記号の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DataGrdViewに関連付けたデータ...
-
【Excel VBA】先頭の「0」飛び...
-
.NET SqlDataReader のレコー...
-
GASでスプレッドシートの一番上...
-
Listviewのデータを上から順番...
-
VBAでページ番号、ページ最終行...
-
MSFlexGridのデータ表示位置の設定
-
GridViewにバインドせずにデー...
-
DataGridViewで表示に制限をつ...
-
【ASP.NET MVC】一覧編集画面
-
VBA ピボットテーブル自動更新
-
ASP C# データベースから1行取得
-
エクセルマクロ小数点桁数
-
GoogleスプレッドシートからExc...
-
VB.net CrystalReportでプロジ...
-
ListViewで条件によって表示を...
-
PHP+CSVを使った一覧表示&詳細...
-
VBによる可変長ファイルの読み書き
-
ACCESSのVBAで[Split]について
-
コンパイルエラーSubまたは...
おすすめ情報