■ 新・ゲーム開発講座 |
■ へっぽこプログラミング入門♪ |
■第46夜:バイナリSAVE/LOADの基礎 前回決めた方向性でさっそくシステムメニューのSAVE機能の実装を…と行きたいところですが、今回はまずバイナリSAVE/LOADの基礎について解説します。いままで「小物関数は BasicTips.cpp を参照してください」で済ませてきましたが、ファイルの入出力部分だけはきちんと押さえていきたいという次第です。なにしろ、基本中の基本ですし(・ω・)ノ テキストモードを無視してバイナリモードで読み書きをするのは、実はテキストモードで読み書きするメリットがあまりないからです。テキストモードでテキストファイルを読むと改行コード
CR-LF (キャリッジ リターンとラインフィード) がラインフィード文字 (LF) に置き換えられるのですが、本稿のシステムでは文字コードを直接処理(とゆーか改行コードは無視
^^;)しているので実用上まったく無問題なのです。過去10年くらいこれで不自由していないのでたぶんこれからも大丈夫だろうと安直に考えています(爆)
実は今回以降、BasicTips.cpp のバイナリSAVE、バイナリLOADの関数 HLS_bload()、HLS_bsave() はC言語のストリーム入出力を使ったものからWindowsのAPIを使ったものに差し替えて使用します。K&R式の古典的手法より、Win32-APIの方がWindows上ではご利益が大きいからです。 ■バイナリSAVE 汎用性を考えて、お手軽なSAVE用関数 HLS_bsave() を以下のリストのように定義します。引数は、ファイル名、データのアドレス、書き込みサイズです。データのアドレスを void型のポインタで定義したのは、あらゆるポインタで暗黙の変換が行われる(要するにどんな構造体のアドレスを渡してもOK)ためです。Windowsのように無数のポインタの型が存在する環境では、このvoid型のように何でもOKで通してくれる存在は貴重といえましょう(^0^) |
bool HLS_bsave(char *f_name,void *buf,int
size )
{
|
では関数の内容を解説します。 ファイルを開くにはWin32 APIの CreateFile()
を使います。ここで言う「開く」とはファイルにアクセスするための準備をするということで、まだ実際にデータを書き込む訳ではありません。アクセスモードは
GENERIC_WRITE(書き込み専用) を指定します。またファイル生成オプションとしては CREATE_ALWAYS
を指定します。 書き込みは、SetFilePointer() でファイルポインタを FILE_BEGIN (=先頭)に設定してから WriteFile() で行います。 WriteFile() には実際に書き込んだデータサイズを引数のアドレスに格納するのですが、ここでは特に使用しないので受け皿の変数を用意したのみで活用はしていません(^^;) 書き込みが終わったら、CloseHandle() でファイルを閉じて終了です。 ついでなので、バイナリLOADのお手軽関数も整備してしまいましょう。内容はバイナリ |
bool HLS_bload(char *f_name,void *buf)
|
では順次内容を解説します。 読み込みは、SetFilePointer() でファイルポインタを先頭にもってきてから
ReadFile() にて行います。最後にファイルを CloseHandle() で閉じて完了です。 |