[wizs] 另一種腳本檔
目前我所使用的腳本檔格式是
times=1##
value=100##
step1_msg=hi##
step1_end=end1##
step2_msg=hello##
step2_end=end2##
但是常見的腳本檔則如下..
[SYSTEM]
times=1
value=100
[STEP1]
msg=hi
end=end1
[STEP2]
msg=hello
end=end2
聖殿基本上不會採這樣的做法,不過業界蠻常用的。
它的做法大致如下..
str="mapping data=([\n";
int k=0;
while(tmp=read_file(CONFIG_FILES)!=EOF)) // 實際上沒有 EOF 這裡是簡單說明起見
{
tmp=substr(tmp,"\n","");
if(tmp[0..0]=="[")
{
if(k!=0)
{
k=0;
str+="]),\n";
}
str+="\""+tmp[1..strlen(tmp)-2]+"\":([\n";
k=1;
continue;
}
sscanf(tmp,"%s=%s",t1,t2);
str+="\""+t1+"\":";
if(atoi(t2)!=0)
str+=t2+",\n";
else
str+="\""+t2+"\",\n";
}
str+="]);\n";
這樣寫的優缺點是
優點 缺點
資料欄位 同類的資料集中在 資料的新增必須依
同一欄位, 美觀 照規定, 死板
資料解析 資料宣告格式較簡 資料解析較複雜
單而且載入較快
另外一種資料解析方式是整篇讀入、多段解析
tmps=explode(read_file(CONFIG_FILES),"\n");
j=sizeof(tmps);
// 第一段, 先把不是 [ 開頭的做修改
for(i=0;i<j;i++)
{
tmp=tmps[i];
if(tmp[0..0]!="[")
{
sscanf(tmp,"%s=%s",t1,t2);
tmp="\""+t1+"\":";
if(atoi(t2)!=0)
tmp+=t2+","; // "xxx":xx,
else
tmp+="\""+t2+"\","; // "xxx":"xx",
tmps[i]=tmp;
}
}
// 第二段, 再把 [ 開頭的做更動
for(i=0;i<j;i++)
{
tmp=tmps[i];
if(tmp[0..0]=="[")
{
sscanf(tmp,"[%s]",t1);
tmp="([\""+t1+"\":(["; // "xxx":([
tmps[i]=tmp;
if(i>0)
{
tmp=tmps[i-1];
tmp+="]),"; // "xxx":"xx",]),
tmps[i-1]=tmp;
}
}
// 第三段, 整合
str="mapping data=(["+implode(tmps,"\n")+"\n])]);\n";
分段的缺點是必須做兩次迴圈,優點是正確率較高,而
且最後只需用 implode 就可以把修改完的結果匯集回
string 資料(字串的累加使用可以降到最低),適合腳
本檔很大的型式。
當然,實際上業界是沒有 mapping 的,比較常見的有
兩種
一、只有 array
這個就要做一些變通的做法,常見於純 c、matlab
等程式語言。
二、有 structure
這個就支援類似 mapping 的東西(資料-欄位-屬性)
,如 data.value, data.times, ...
業界還有一種做法,就是你只要改了 config 檔...
一、程式馬上套用修改後的結果
這種的代表它在執行特定動作時會即時去讀取 config
檔的內容,不過這種的很少見,因為畢竟頻繁地存取
硬碟的資料並非好事
二、需重新執行該程式才會套用修改後的結果, 或是必須
執行某指令去 reload config 檔才會更新
如 dosbox 的 config 檔就是這類的模式
通常第二種做法是比較常見的。
Laechan
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 101.15.251.80
※ 編輯: laechan 來自: 122.117.11.103 (11/18 12:57)
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章
35
58
120
255