首页 > 代码库 > 两种文件配置项设置方法及C程序处理的比较
两种文件配置项设置方法及C程序处理的比较
在实际的软件开发项目中,程序经常需要从外界读取某些可能会变化的信息,我们把需要读取的信息统一放到一个文件中(通常是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程序处理的比较