プログラムを作成すると現在のちょこっとしたデータを保存しておく必要があるはずでしょう。
まずはnote命令(メモリーノートパッド)というようなHSP命令を使ってメモ帳でも見れるテキスト形式で保存します。必ず最初にnotesel命令を使います。noteadd命令で書き出す文字を指定します。第2パラメータのインデックス番号は0から始まるとのことので注意して下さい。
notesel data
// インデックス0(1行目)とインデックス1(2行目)のデータを書き出す
noteadd "500",0
noteadd "こんにちは",1
// ファイルとして出力する
notesave "hsp-test1.dat"
mes "保存!"
作成されたhsp-test1.datをメモ帳なんかでオープンしてみて下さい。ちゃんと下みたいに保存されてますか。
500
こんにちは
次にバイナリデータとして保存してみます。bsave命令を使います。メモ帳で見ると文字が化けたように見えます。ここでは数値に書き出しにpoke命令(1バイト分)、wpoke命令(2バイト分)、lpoke命令(4バイト分)を使っています。
// バッファ確保
sdim data
// 0バイト目に数値データを書き出します
lpoke data,0,500
// 同じように4バイト目、8バイト目に
lpoke data,4,100
lpoke data,8,777
// ファイルとして出力する
bsave "hsp-test2.dat",data
mes "保存!"
作成されたhsp-test2.datをメモ帳でオープンしてみて下さい。なんだがよく分からないデータが保存されてますか。
2つのファイルを保存できましたので、今度は逆にこのファイルからデータを読み込んでみることにしましょう。「exist」命令でファイルがあるか確認します。そうしないとHSPエラーになるので。
// まずファイルがあるか確認
exist "hsp-test1.dat"
if strsize=-1:mes "ファイルがありません!":stop
// おなじない
notesel data
// ファイルを読み込みます
noteload "hsp-test1.dat"
// そのまま表示する
mes data
ちゃんと表示されましたか。今度は1行目と2行目を別々に表示してみましょう。(ファイルの確認は略)
notesel data
noteload "hsp-test1.dat"
// インデックスを指定して取り出す
noteget a,1
mes "2行目:"+a+""
noteget b,0
mes "1行目:"+b+""
得られた2行目の数字(500)を足し算(+55)してみましょう。
notesel data
noteload "hsp-test1.dat"
// インデックスを指定して取り出します
noteget a,0
// 足し算???
b=a+55
mes b
あらら・・・、「50055」になりませんか? 見た目には分からないですが取り出した数字はあくまでも文字になってます。つまり、「500」と「55」という文字をくっつけた結果になってしまたったんです。ためしに引き算や掛け算もやってみて下さい。HSPエラーになります。計算ででてくる小数点の話(ここでは左側の変数に優先)と同じです。これを解決するには文字列を数値に変える必要があるわけで、「int関数」使うといいです。
notesel data
noteload "hsp-test1.dat"
noteget a,0
// 足し算!!!
b=int(a)+55
mes b
最後にバイナリのデータとして作成したファイルを読み込みます。逆パターンのpeek関数、wpeek関数、lpeek関数でデータを取り出ていきます。(ファイルの確認省略)
sdim data
// ファイルを読み込みます
bload "hsp-test2.dat",data
mes ""+lpeek(data,0)+""
mes ""+lpeek(data,4)+""
mes ""+lpeek(data,8)+"\n"
// 数値なので、そのまま演算できます
mes lpeek(data,0)*lpeek(data,4)
簡単にファイルへの保存と読み込みを説明しましたが、ゲームの得点やレベルみたいなものをセーブしとく場合はこれでは意味があまりありません。データを簡単にいじれしまうからです。サーチエンジンなどで「暗号化 HSP」みたいで調べて下さい(丸投げ...)。