トップページ > 記事閲覧
FileRead_open()の引数に書式付き文字列を使いた
名前:テンゲンロンパ 日時: 2014/05/15 15:23

セーブデータをロードする自作関数loadsav()を作り loadsav(int saveNo){ int FileHandle = FileRead_open("save%d.sav", saveNo) ; if(FileHandle == -1) return -1 ; //エラーが出たら終了 FileRead_read 〜処理〜 } としたいのですが上手くいきません。 FileRead_open()でエラーが出ているわけではないようですが、おかしな値を読み込んでしまいます。 書式付き文字列を使わずにFileRead_open("save1.sav")としたときは正常に動きます。 引数に書式付き文字列を使うには、もしくは自作関数loadsav()の引数を変えるだけで読み込むファイルを変えるにはどうすればいいのでしょうか。
メンテ

Page: 1 |

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さんありがとうございます。 お二人の仰るとおりにやってみたところ無事セーブデータをロードすることができました。 ありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存