質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2511閲覧

セーブしたいのに、datファイルを読み込んでくれない

jyarin

総合スコア12

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/02/07 10:22

セーブしようと下のプログラムを書いたのですが、if(fp == NULL)の項に入ってしまい、セーブすることが出来ません。何が原因でしょうか?

C++

1void kakikomi(int a,int b,int c) { 2 3 FILE* fp; 4 fopen_s(&fp, "セーブデータ.dat", "rb"); 5 if (fp == NULL) { 6 bug(); 7 } 8 fread(&Data, sizeof(Data), 1, fp); 9 fclose(fp); 10 11 fopen_s(&fp, "セーブデータ.dat", "wb"); 12 13 if (fp == NULL) { 14 bug(); 15 } 16 17 if (fp != NULL && c == -1) { 18 Data = { a,b,Data.svwin }; 19 fwrite(&Data, sizeof(SaveData_t), 1, fp); 20 } 21 22 if (fp != NULL && a == 2) { 23 Data = { Data.svgide,Data.svmusic,Data.svwin + 1 }; 24 fwrite(&Data, sizeof(Data), 1, fp); 25 } 26 fclose(fp); 27}

bug()は、画面上に「申し訳ございませんが、ファイルを読み取れませんでした」と表示する為のvoidです。

ちなみに、このプログラムの全容は以下のように説明できます。


ゲームの設定画面などからセーブデータ(ゲーム開始時にルール説明は必要か、BGMは必要か、今まで何勝したか)に変更があったときに、呼び出される

まずは今までのセーブデータを読み取る

変更が必要な変数のみ変更する(例えば、設定画面からは「今まで何勝したか」を変更する必要は無いため、int cは-1が届き、svwinは変更されない)

変更を保存する


自分で調べたこと

読み取りモード"rb"を用いたfopen_s(&fp, "セーブデータ.dat", "rb")ではファイルが生成されないことを知ったので、ゲーム開始時にファイルがないときは生成させる為のプログラムを作りました。
でもこれを使っても、まだfp == NULLのままです。

C++

1void startfile() { 2 FILE* fp; 3 FILE* fp2; 4 fopen_s(&fp, "セーブデータ.dat", "rb"); 5 if (fp == NULL) { 6 fopen_s(&fp2, "セーブデータ.dat", "wb"); 7 Data = { 0,0,0 }; 8 fwrite(&Data, sizeof(Data), 1, fp2); 9 fclose(fp2); 10 } 11 fclose(fp); 12}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/02/07 10:49

エンコーディングを確認してください。
t_obara

2020/02/07 11:02

せっかくfopen_sを利用しているのであれば、その戻り値を確認すれば良いのでは?原因がわかりやすくなります。
jyarin

2020/02/07 11:08

戻り値は0でした。
Zuishin

2020/02/07 11:11

カタカナは苦手かな?
jyarin

2020/02/07 11:23

"セーブデータ.dat"を全て"savedata.dat"にしてctrl+F5を押したところ、プロジェクトと同じディレクトリにsavedata.datが生成され、戻り値は以前0のままなのに、bug()が発生しました。
Zuishin

2020/02/07 11:33

生成されたということはそれまで無かったということなので、当然 fp は NULL になります。
jyarin

2020/02/07 11:39

プログラムの起動時にvoid startfile()(上に書いてあります)をして、とりあえず{0,0,0}という情報は入れてあるはずなのですが、それでも読み取ってもらえないようです。
Zuishin

2020/02/07 11:50

それがどういう順序でどのように行われているか、また「セーブデータ」でなく全て「savedata」になっているかをステップ実行して確かめてみてください。ファイル名は各所でそれぞれ書いたのでは間違う可能性があるので、変数に入れて共通で使う方がいいと思います。また、別のところでそのファイルを開いていないかどうかも確かめてください。
guest

回答2

0

自己解決

ここに書いていない範囲で、fopen_sしたのにfcloseしていない場所があって、それが悪さをしていたみたいです。

協力して頂いた皆さん、申し訳ありませんでした。

投稿2020/02/07 11:49

jyarin

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

fopen_s(&fp, "セーブデータ.dat", "rb");

これでは読み出しようにファイルをオープンするので、このファイルがないときはNULLになります
この"セーブデータ.dat"というファイルが有るかどうかチェックしてみてはどうでしょう

投稿2020/02/07 10:32

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jyarin

2020/02/07 10:48

残念ながら、セーブデータ.datというファイルがこのゲームの.slnファイルと同じ場所にあるのです。 なのに読み取ってもらえません。 説明不足で申し訳ありません。
y_waiwai

2020/02/07 10:52

そいつの実行ファイルはどこにあるか調べてみよう "../../セーブデータ.dat" でいける、、かな?
episteme

2020/02/07 10:57 編集

プロジェクトと同じdir.に置いたらどうです? # visual studio 内で起動したら(デフォルトで)プロジェクトdir.がカレントになるはず
jyarin

2020/02/07 11:16

dir.はディレクトリの事でしょうか? でしたら、セーブデータ.detはゲームの.slnファイルと同じ位置に入れてあります。
SaitoAtsushi

2020/02/07 11:42

sln はソリューションファイルですよね? そうではなくプロジェクトディレクトリです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問