用lua做設定檔
可以用lua做程式的設定檔。
LuaPlus提供了讀寫lua指令檔的功能,我們可以將配置資訊以Table的形式儲存在lua指令碼中,然後利用LuaPlus進行讀取和更改。
一、建立設定檔
設定檔可以用文字編輯器建立,也可以在C++代碼中建立。我們先在C++中建立。利用CreateTable建立一個名為"Window"的表格,利用LuaObject的Set*函數設定表格內容,最後用DumpObject函數儲存到檔案。代碼如下:void SaveTable()
...{
LuaStateOwner state;
LuaObject myTable = state->GetGlobals().CreateTable("Window");
myTable.SetInteger("width", 640);
myTable.SetInteger("height", 480);
myTable.SetString("title", "My First Window");
myTable.SetBoolean("enabled", true);
myTable.SetInteger("alpha", 128);
myTable.SetString("backgroundimage", "bg.jpg");
state->DumpObject("FirstWindow.lua", "Window", state->GetGlobals()["Window"], 0);
}
相關函數的說明參見文檔。
二、讀取設定檔
Lua設定檔的載入和其它指令檔一樣,可以用DoFile函數,然後可以用GetGlobals加索引的形式擷取表格LuaObject對象,最後用[ ]訪問表格的元素。代碼如下:void ReadShowTable()
...{
LuaStateOwner state;
state->DoFile("FirstWindow.lua");
LuaObject myTable = state->GetGlobals()["Window"];
//get Window Table's item
printf("Window Table in FirstWindow.lua: ");
printf("width = %d ", myTable["width"].GetInteger() );
printf("height = %d ", myTable["height"].GetInteger() );
printf("title = %s ", myTable["title"].GetString() );
printf("enabled = %s ", myTable["enabled"].GetBoolean() ? "true" : "false" );
printf("alpha = %d ", myTable["alpha"].GetInteger());
printf("backgroundimage = %s ", myTable["backgroundimage"].GetString() );
}
三、更改設定檔
讀取設定檔的過程和上一節類似,更改與儲存和第一節類似。代碼如下:void RewriteTableContents()
...{
LuaStateOwner state;
state->DoFile("FirstWindow.lua");
LuaObject myTable = state->GetGlobals()["Window"];
myTable.SetInteger("width", 800);
myTable.SetInteger("height", 600);
printf("new width=%d, height=%d ",myTable["width"].GetInteger(), myTable["height"].GetInteger());
state->DumpObject("FirstWindow.lua", "Window", state->GetGlobals()["Window"]);
}
值得注意的是,更新設定檔時,不能單獨更新表格的某一個元素。我實驗了下,出錯。也許是我的方法不對。所以我現在一次更新整個表格。
下面是main函數:
int _tmain(int argc, _TCHAR* argv[])
...{
printf("now create table and save in FirstWindow.lua: ");
SaveTable();
printf("now read table from FirstWindow.lua: ");
ReadShowTable();
printf("now retrieve the table, change the "width" and "height" value, then save: ");
RewriteTableContents();
printf("now, re-read from FirstWindow.lua: ");
ReadShowTable();
return 0;
}
工程的設定和上一篇文章一樣。
F7編譯後CTRL+F5即可看到運行結果。
值得注意的是,table可以嵌套table。這樣我們便可以實現複雜的設定檔。