HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0814
cmoritoshi簡易設定ファイル読み書きモジュール(複数ファイル対応)0解決


cmoritoshi

リンク

2021/8/14(Sat) 16:13:57|NO.93580

いつもお世話になってます。
個人的に複数の設定ファイルを扱うのが必要で、それをモジュール化したものですが、
セーブテータとか設定ファイルとかに使えそうなので共有します。

設定ファイルの読み込み、取得、変更、保存が簡単に行えるモジュールです。
仕様としては、
・INIファイルとは違う
・複数のファイルを扱える
・すべて文字列で入出力、値を取得してから型変換する
・"="と改行は含まないようにする
ぐらいでしょうか

以下にモジュールとサンプルプログラムを置いておきます。
自由に使ってOKです。

モジュール "mod_setting.as"

//設定変更保存モジュール //設定を簡単にテキストに保存 //モジュールここから #ifndef mod_ct_setting_as #define mod_ct_setting_as #module mod_ct_setting //設定ファイルの設定、読み込み //setting_set p1, p2 //p1=文字列 : 設定ファイル名(パス) //p2=0〜(0) : 設定ファイルのインデックス(複数使用時) //ファイルが存在し、読み込みが完了した場合はstatに1 //そうでない場合は0を返します。 #define global setting_set(%1, %2=0) setting_set1 %1, %2 #deffunc setting_set1 str file1, int cnt_f mod_setting_files(cnt_f) = file1 mod_setting_files_bak(cnt_f) = "" mod_setting_key_cnt(cnt_f) = 0 exist file1 if strsize > 0 { sdim mod_setting_buf, strsize sdim mod_setting_tempstr, strsize mod_setting_tempint = 0 bload file1,mod_setting_buf split mod_setting_buf, "\n", mod_setting_tempstr repeat stat mod_setting_tempint = instr(mod_setting_tempstr(cnt), 0, "=") if mod_setting_tempint > 0 { mod_setting_key(mod_setting_key_cnt) = strmid(mod_setting_tempstr(cnt), 0, mod_setting_tempint) mod_setting_value(mod_setting_key_cnt) = strmid(mod_setting_tempstr(cnt), mod_setting_tempint+1, strlen(mod_setting_tempstr(cnt)) ) mod_setting_index(mod_setting_key_cnt) = cnt_f mod_setting_key_cnt++ } loop //解放 sdim mod_setting_buf,64 sdim mod_setting_tempstr,64 mod_setting_stat = 1 } else { mod_setting_stat = 0 } return //設定ファイルのバックアップ設定 //setting_bak p1, p2 //p1=文字列 : 設定ファイル名(パス)(バックアップ用) //p2=0〜(0) : 設定ファイル(バックアップ用)のインデックス(複数使用時) //この命令を使用しない、またはp1を""にした場合 //バックアップは無効になります。 //必ずsetting_setを先に実行してください。実行時にバックアップ設定が初期化されます。 #define global setting_bak(%1, %2=0) setting_bak1 %1, %2 #deffunc setting_bak1 str file1, int cnt_f mod_setting_files_bak(cnt_f) = file1 return //設定内容の取得 //Val = setting_get(p1,p2) //p1=文字列 : キー(設定項目)文字列 //p2=0〜(0) : 設定ファイルのインデックス //正常に取得した場合はstatに0が返されます。 //キーが見つからないとき、キーが""のときは"NULL"が返され、statに-1が返されます。 #define global setting_get(%1, %2=0) setting_get1 %1, %2 #defcfunc setting_get1 str key1, int cnt_f mod_setting_tempstr = "NULL" mod_setting_tempint = -1 if key1 != "" { repeat mod_setting_key_cnt if ( mod_setting_key(cnt) = key1 ) and ( mod_setting_index(cnt) = cnt_f ) { mod_setting_tempstr = mod_setting_value(cnt) mod_setting_tempint = 0 break } loop } mod_setting_stat = mod_setting_tempint return mod_setting_tempstr //設定内容の変更、設定 //setting_put p1, p2, p3 //p1=文字列 : キー(設定項目)文字列 //p2=文字列 : 設定値文字列 //p3=0〜(0) : 設定ファイルのインデックス //設定値は文字列に変換してください。 //double型の場合はstrf、int型はstr //変更された場合はstatに0、追加された場合はstatに1、 //キーが空白の場合はstatに-1が返ります。 #define global setting_put(%1, %2, %3=0) setting_put1 %1, %2, %3 #deffunc setting_put1 str key1, str val1, int cnt_f mod_setting_tempint = 1 if key1 != "" { repeat mod_setting_key_cnt if ( mod_setting_key(cnt) = key1 ) and ( mod_setting_index(cnt) = cnt_f ) { mod_setting_value(cnt) = val1 mod_setting_tempint = 0 break } loop if mod_setting_tempint = 1 { //キーがないときは追加 mod_setting_key(mod_setting_key_cnt) = key1 mod_setting_value(mod_setting_key_cnt) = val1 mod_setting_index(mod_setting_key_cnt) = cnt_f mod_setting_key_cnt++ } } else { //キーが""のときはstat=-1 mod_setting_tempint = -1 } ;mod_setting_stat = mod_setting_tempint return mod_setting_tempint //設定キーの削除 //setting_del p1,p2 //p1=文字列 : キー(設定項目)文字列 //p2=0〜(0) : 設定ファイルのインデックス //正常に削除した場合はstatに0が返されます。 //キーが見つからない場合はstatに-1が返されます。 #define global setting_del(%1, %2=0) setting_del1 %1, %2 #deffunc setting_del1 str key1, int cnt_f mod_setting_tempint = -1 if key1 != "" { repeat mod_setting_key_cnt if ( mod_setting_key(cnt) = key1 ) and ( mod_setting_index(cnt) = cnt_f ) { mod_setting_key(cnt) = "" mod_setting_tempint = 0 break } loop } ;mod_setting_stat = mod_setting_tempint return mod_setting_tempint //設定内容の保存 //setting_save p1 //p1=0〜(0) : 設定ファイルのインデックス //正常に保存された場合はstatにファイルサイズが返されます。 #define global setting_save(%1=0) setting_save1 %1 #deffunc setting_save1 int cnt_f //バックアップ設定がある場合 if mod_setting_files_bak(cnt_f) != ""{ bcopy mod_setting_files(cnt_f), mod_setting_files_bak(cnt_f) } mod_setting_tempint = 0 repeat mod_setting_key_cnt mod_setting_tempint += strlen(mod_setting_key(cnt)) + strlen(mod_setting_value(cnt)) + 3 loop sdim mod_setting_buf,mod_setting_tempint sdim mod_setting_tempstr,512 mod_setting_tempint = 0 repeat mod_setting_key_cnt if ( mod_setting_key(cnt) != "" ) and ( mod_setting_index(cnt) = cnt_f ) { mod_setting_tempstr = mod_setting_key(cnt) + "=" + mod_setting_value(cnt) + "\n" memcpy mod_setting_buf, mod_setting_tempstr, strlen(mod_setting_tempstr), mod_setting_tempint mod_setting_tempint += strlen(mod_setting_tempstr) } loop bsave mod_setting_files(cnt_f), mod_setting_buf, mod_setting_tempint //解放 sdim mod_setting_buf,64 sdim mod_setting_tempstr,64 return mod_setting_tempint //モジュール内イニシャライズ命令 //モジュール内のみで使用、通常は使用しない #deffunc setting_init sdim mod_setting_files, 256, 1 sdim mod_setting_files_bak, 256, 1 sdim mod_setting_key, 50, 50 sdim mod_setting_value, 50, 50 dim mod_setting_index, 50 mod_setting_key_cnt = 0 mref mod_setting_stat, 64 return #global #endif //モジュールの初期化 setting_init //モジュール終わり

サンプル

#include "mod_setting.as" #define file_set "test_setting.txt" //ファイルの設定 setting_set file_set //設定の変更 repeat 1000 setting_put "設定項目"+cnt, "設定値"+cnt loop //設定をファイルに保存 setting_save file_cnt mes "保存しました" wait 300 end



この記事に返信する


ONION software Copyright 1997-2023(c) All rights reserved.