標籤:style http color ar for sp 檔案 資料 on
在實際的軟體開發項目中,程式經常需要從外界讀取某些可能會變化的資訊,我們把需要讀取的資訊統一放到一個檔案中(通常是ini檔案),並把這個檔案叫做設定檔。
考慮這樣一個情境,程式需要與多個資料庫打交道,要從設定檔中讀取各個資料庫的資訊。那麼,我們如何在設定檔中設定各個配置項以及如何編寫程式將各配置項的值讀入呢?
假設有兩個資料庫,每個資料庫包含了IP地址和連接埠號碼兩種資訊。那麼,設定檔中配置項的設定有如下兩種形式:
(1) 形式一:
[GENERAL]
; database count
DBNum=2
[DBINFO1]
IPAddress=
Port=
[DBINFO2]
IPAddress=
Port=
(2) 形式二:
[DBINFO]
; database count
DBNum=2
; Info of database1
IPAddress1=
Port1=
; Info of database2
IPAddress2=
Port2=
在形式一中,首先在[GENERAL]配置段裡面設定資料庫的個數,之後在[DBINFO1]和[DBINFO2]中設定具體的資料庫資訊。
在形式二中,資料庫的資訊就放在[DBINFO]配置段裡面。在該配置段下,首先設定資料庫的個數,然後是每個資料庫的具體資訊。
讀取這兩種形式的配置項值的C程式碼如下:
(1) 形式一:
……
#define MAX_DB_NUM (10) // 最大資料庫個數,用於限制配置的資料庫的個數
int g_DBNum = 0; // 全域變數,用於表示配置的資料庫的個數
// 資料庫資訊結構體
typedef struct
{
char szIPAddress[128]; // IP地址
int iPort; // 連接埠號碼
}T_DBInfo;
T_DBInfo g_tDBInfo[MAX_DB_NUM] = {0}; // g_tDBInfo用於存放資料庫的具體資訊
……
g_DBNum = GetPrivateProfileInt("GENERAL", "DBNum",1, szIniFile); // szIniFile中存放設定檔名
for (iLoopFlag = 0; iLoopFlag < g_DBNum; iLoopFlag ++)
{
memset(szDBSectName,0x00, sizeof(szDBSectName));
_snprintf(szDBSectName,sizeof(szDBSectName)-1, "DBINFO%d", (iLoopFlag+1));
// 讀取IP地址
GetPrivateProfileString(szDBSectName, "IPAddress","", g_tDBInfo[iLoopFlag].szIPAddress, sizeof(g_tDBInfo[iLoopFlag].szIPAddress),szIniFile);
// 讀取連接埠號碼
g_tDBInfo[iLoopFlag].iPort = GetPrivateProfileInt(szDBSectName,"Port", 9999, szIniFile);
}
(2) 形式二:
……
#define MAX_DB_NUM (10) // 最大資料庫個數,用於限制配置的資料庫的個數
int g_DBNum = 0; // 全域變數,用於表示配置的資料庫的個數
// 資料庫資訊結構體
typedef struct
{
char szIPAddress[128]; // IP地址
int iPort; // 連接埠號碼
}T_DBInfo;
T_DBInfo g_tDBInfo[MAX_DB_NUM] = {0}; // g_tDBInfo用於存放資料庫的具體資訊
……
g_DBNum = GetPrivateProfileInt("DBINFO", "DBNum",1, szIniFile); // szIniFile中存放設定檔名
for (iLoopFlag = 0; iLoopFlag < g_DBNum; iLoopFlag ++)
{
// 讀取IP地址
memset(szDBSectName, 0x00, sizeof(szDBSectName));
_snprintf(szDBSectName,sizeof(szDBSectName)-1, "IPAddress%d", (iLoopFlag+1));
GetPrivateProfileString(“DBINFO”, szDBSectName, "", g_tDBInfo[iLoopFlag].szIPAddress,sizeof(g_tDBInfo[iLoopFlag].szIPAddress), szIniFile);
// 讀取連接埠號碼
memset(szDBSectName, 0x00, sizeof(szDBSectName));
_snprintf(szDBSectName,sizeof(szDBSectName)-1, " Port%d", (iLoopFlag+1));
g_tDBInfo[iLoopFlag].iPort = GetPrivateProfileInt(“DBINFO”, szDBSectName,9999, szIniFile);
}
在實際項目中,以上兩種形式的配置項設定方法都會用到,大家要根據項目組的要求、程式特點等進行合理的選擇。
(本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,號:245924426,歡迎關注!)
兩種檔案配置項設定方法及C程式處理的比較