テキストのロードとセーブ
前章ではファイルの読み書きについて説明しましたが、
この章では、別途用意されたテキスト形式の読み書きに特化したメモリノートパッド命令を紹介します。
単純なテキスト形式であれば、これから紹介する命令を使用するほうが簡単で安全です。
まず、命令を使用する前の手続きとして、この命令を使用する必要があります。
| notesel 対象変数 |
| | | |
| 対象変数 | テキスト操作を行う対象変数を指定する。 |
パラメータには、「これから説明していく命令」でも操作の対象とする変数を指定します。
他の命令でも使用する変数を指定するということは、
他の命令側では対象変数を使用する必要がない、逆に取ると指定できないことも意味します。
さて、メモリノートパッド命令はバイナリ操作命令と異なり、対象変数を文字列型として扱おうとします。
もし、指定する変数がまだ未使用であったり、文字列型以外の変数であったとしても、
notesel命令を使用した時点で文字列型となります。バグの原因にならないよう覚えておきましょう。
notesel s //「s」をメモリノートパッド操作対象にする
mes s // 型変換されて文字列型となるので「0」が表示されない
|
対象変数の指定を行った後で保存命令を使ってみましょう。
bsave命令と比べると、パラメータが随分とシンプルです。
notesave命令に指定するのは書き出し先のファイル名指定のみで、
notesel命令で指定している変数内容を全て(NULL文字まで)保存します。
逆を言えば、テキストの一部だけを保存したりと細かい処理が出来ないのですが、
通常は全てを保存し、全てを読み込むものでしょうから、大した障害ではないと思います。
それでは、違いがわかるように前章のサンプルをnotesave命令に書き換えてみます。
次に、bload命令の代わりになる読み込み命令を説明します。
| noteload ファイルパス, 読込サイズ |
| | | |
| ファイルパス | 読み込み元のファイルパスを指定する。 |
| 読込サイズ | 読み込む最大サイズを指定する。(※指定しなければテキストサイズ) |
この命令もbload命令に比べ、シンプルになりました。
第1パラメータに読み込むテキスト系ファイルを指定し、第2パラメータにサイズをします。
尚、サイズ指定はbload命令の意味合いとは少し違います。
bload命令は、最大でも変数分までのデータしか読み込めず、
省略または−1(マイナス値)を指定すると変数サイズまでを読み込むというものでした。
一方のnoteload命令では、サイズ指定をすることで、
どんな大きさのファイルでも指定サイズ(小さければ当然そこファイルサイズ)まで読み込むようになり、
省略または0(−1ではない)を指定すると、ファイルサイズ分を読み込むようになります。
指定したサイズや省略した時に読み込むテキストサイズが変数サイズを上回った場合、
変数サイズが自動拡張される仕組みとなっています。
さらに、読み込んだ後は自動的にNULL文字が末端に付加されるので、
bload命令の時のように今まで入っていたテキストサイズより小さなデータを読み込んでも
ゴミがつくことはありません。便利ですね。
それでは、この命令もbload命令と同じプログラム構造にしてみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
sdim buf, 256
notesel buf
objsize 320, 25
mesbox buf, 640, 455, 5
button "読み込む", *load
pos 320, 455 : button "保存する", *save
stop
*load
dialog "txt", 16, "読込元"
if stat {
noteload refstr // 変数に読み込む
title "読み込んだサイズ:" + strsize
objprm 0, buf
}
stop
*save
dialog "txt", 17, "保存先"
if stat : notesave refstr
|
前章プログラムと同じく、exist命令による読み込みファイルの存在チェックを入れてませんので、
実際にエディタ系プログラムを作っていく場合は、exist命令も入れるようにしましょう。
続いて、メモリノートパッドの情報を取得するマクロ関数を説明します。
| notemax |
| | | |
| [パラメータなし] | 対象メモリノートパッド変数から取得するだけの為、パラメータは必要ない。 |
現在、notesel命令で指定されている変数が対象で、パラメータはありません。
この関数を使うと、対象変数内の行数を取得することが出来ます。
尚、HSP2以前はnotemax命令として、実際に命令として存在していましたが、
HSP3からはマクロ関数として「common/hspdef.as」に定義されているだけなので、
「HSP拡張マクロを使用する」設定になっていない場合は使えません。
マクロではありますが当然、使用する前にはnotesel命令で変数を指定するようにしましょう。
この章最後に紹介するのは、メモリノートパッドの情報を取得する関数で、notemax関数の実体です。
パラメータには、notemax関数と同じ効果の全体行数を取得するモードである0か、
テキストサイズを取得する1のいずれかを指定します。
尚、全体サイズを取得するモード1はstrlen関数と同じ結果であり、
notesize関数としてnotemax関数と同じく「common/hspdef.as」に定義されています。
notesize関数として使いたい場合は、「HSP拡張マクロを使用する」チェックを付けておきましょう。
将来はモードが増えるかもしれませんが、現段階ではこの2種類だけであり、
モード1はstrlen関数で代用できますし、モード0はHSP2の互換用に残されたnotemax関数を使うのなら、
HSP3から登場したこのnoteinfo関数自体を直接使う機会は少ないかもしれません。
それでも例えば拡張マクロのチェックが外れていたり、書き換わっていてnotemax関数が使えなかった時に
notemax関数はnoteinfo関数のマクロであるという存在を知っているのと知らないのとでは違ってきます。
…ということで覚えておくのも悪くないでしょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
sdim buf, 256
notesel buf
objsize 320, 25
mesbox buf, 640, 455, 5
button "読み込む", *load
pos 320, 455 : button "保存する", *save
stop
*load
dialog "txt", 16, "読込元"
if stat {
exist refstr
if strsize = -1 : stop
noteload refstr
title "読み込んだサイズ:" + noteinfo(1) + " 行数:" + noteinfo(0) // 情報取得
objprm 0, buf
}
stop
*save
dialog "txt", 17, "保存先"
if stat : notesave refstr
|