2012年6月30日 星期六

C++ INI 類別的設計

使用INI格式,底下有幾個優點。
  1. 格式簡單易懂 、容易使用
  2. 編輯器隨處可得,編輯維護相對容易
  3. 實作一個INI Parser不難
在程式裡,無論是作為程式設定儲存格式,或是作為小型的資料庫格式,使用INI資料格式對於以上需求,綽綽有餘。Good Game Editor的資料格式就是現成的實例。

;

INI的格式內容非常結構化,一個INI是由Section組成,每一個Section裡面可以包含Item,每一個Item是由一對Key和Value組成。

  • 一個Section由字元'['及']'所構成,括號所包圍起來的字串為Section的名稱。如[Player]。
  • Item由Key及Value成對以字元'='隔開組成。如Name=Waync Cheng。
  • 所有在字元';'後面到行尾的文字都視為註解而被忽略。

底下是一個簡單的範例。
[Player]
Name=Waync Cheng
Windows提供了GetPrivateProfileString系列的API可以讀寫INI的資料內容,使用Windows API寫入INI檔案的方式如下。
char StrName[] = "Waync Cheng" WritePrivateProfileString("Player","Name",StrName,"c:\\test.ini");
從INI檔案讀出的方法如下。
char StrName[MAX_LEN];
GetPrivateProfileString("Player","Name","DefaultName", StrName, MAX_LEN, "c:\\test.ini");
;

Windows API使用起來稍微不方便,同時也不具跨平台,底下使用C++語言設計一個新的INI讀寫類別,主要的設計考量是更方便的讀寫INI。

C++語言提供了operator overloading的機制,正好可以被我們利用來作為一個介面,讓我們可以更直覺的讀寫INI的內容。

設sec是個C++的INI Section Object,我們可以下面的方法對它作操作。
sec["Item1"] = 12345;
sec["Item2"] = "string";
sec["item3"] = 123.456;

int item1 = sec["Item1"];
string item2 = sec["Item2"];
double item3 = sec["Item3"];
這是充分利用了C++ operator overloading的好處,讓我們程式的寫作更直覺明瞭。同樣的設ini是一個INI的檔案物件。底下的示範,結合上面對Section和Item的操作。
ini["Sec"]["Item1"] = 12345;
ini["Sec"]["Item2"] = "string";
ini["Sec"]["item3"] = 123.456;

int item1 = ini["Sec"]["Item1"];
string item2 = ini["Sec"]["Item2"];
double item3 = ini["Sec"]["Item3"];
以上的示範是對於INI裡Section的Item的讀寫操作,除此之外還可以定義增減Section及Item的操作,對Stream讀寫INI內容等等。這邊就到此為此,不再繼續多說。以上的概念知道後,可以很容易的設計及實作出一個簡單又好用的INI類別。有興趣的人可以動手試試。

Related Posts Plugin for WordPress, Blogger...