Re:FileRead_open()の引数に書式付き文字列を ( No.1 ) |
- 名前:Nameless 日時:2014/05/15 20:11
FileRead_openは書式付き文字列に対応していません。
バグの原因はおそらく、第二引数が1であることによって非同期読み込みフラグが立ってしまっているからです。
このようにすれば動くと思います。
(通りすがりのよっしーさんの投稿を受けて訂正。
FileRead_openの戻り値まで気にしてませんでした。)
loadsav(int saveNo){
int FileHandle;
char filename[25];//適当な大きさのファイル名保存用文字列
sprintf(filename, "save%d.sav", saveNo);//filenameにファイル名をいれる
FileHandle = FileRead_open(filename) ;
if(FileHandle == 0) return -1 ; //エラーが出たら終了
FileRead_read 〜処理〜
}
ただ、sprintfは環境によっては警告を出されるので
その時は警告に従ってください。
|
Re: FileRead_open()の引数に書式付き文字列を使いた ( No.2 ) |
- 名前:通りすがりのよっしー 日時:2014/05/15 19:40
テンゲンロンパさん、こんにちは。
通りすがりのよっしーです。
(Namelessさんに先を越された!でも投稿します)
まず、DXライブラリのリファレンス
homepage2.nifty.com/natupaji/DxLib/function/dxfunc_other.html
の FileRead_open や FileRead_read の説明を参照してみてください。
例えば FileRead_open であれば下記のように書かれています。
--------------------------------------------------------
int FileRead_open( char *FilePath, int ASync ) ;
char *FilePath : 開くファイルのパス
int ASync : 非同期読み込みを行うかどうか
( TRUE:非同期読み込み FALSE:同期読み込み( デフォルト ) )
戻り値
0以外:ファイルハンドル
0:エラー発生
---------------------------------------------------------
そこで loadsav() の記述を見てみます。まず
int FileHandle = FileRead_open("save%d.sav", saveNo) ;
という記述について。おそらく「"save1.sav"」のような文字列を
単純に「"save%d.sav", saveNo」置き換えたのではないでしょうか。
しかし、この記述をリファレンスの説明に対応させると
*FilePath = "save%d.sav"
ASync = saveNo
となるので、下記の動作をしています。
・ファイル名が save%d.sav であるファイルを開く
・saveNoの値によって同期読み込みか非同期読み込みか決まる
C/C++ で書式付き文字列から通常の文字列を得るには
ひと手間の工夫が必要です。たとえば、こんな風:
char filename[_MAX_PATH] ; // ファイル名に十分な大きさのバッファ
sprintf(filename, "save%d.sav", saveNo) ;
int FileHandle = FileRead_open(filename) ;
また、loadsav()の記述には他にもバグがあります。
リファレンスの戻り値の説明から、この関数はエラー発生のときに
0 を返すことが分かりますので
if(FileHandle == -1) return -1 ; //エラーが出たら終了
という記述は、実は「エラーが出ない場合に終了」します。
(だから正しくは if(FileHandle == 0) return -1 ; )
ということは、
「FileRead_open()でエラーが出ているわけではないようですが」
のつもりが実はエラーが出ていたのではないでしょうか。
おかしな値を読み込んでいたとのことですが、FileRead_read関数の
戻り値も調べたほうが良いですね。リファレンスによれば、
この関数の戻り値は、エラーのときに -1 を返すようです。
 |
Re: FileRead_open()の引数に書式付き文字列を使いた ( No.3 ) |
- 名前:テンゲンロンパ 日時:2014/05/15 21:52
通りすがりのよっしーさん、Namelessさんありがとうございます。
お二人の仰るとおりにやってみたところ無事セーブデータをロードすることができました。
ありがとうございました。
|