读取INI配置文件
前言
.ini 文件是Initialization File的缩写,即初始化文件,是windows的系统配置文件所采用的存储格式,统管windows的各项配置。我们在进行程序开发时,经常会用到ini文件进行软件的信息配置,特别是需要显示大量信息,我们不可能把所有字符串等信息都直接写入程序,都放在程序中会导致不易维护,程序杂乱等。所以我们可以通过直接编辑ini文件进行信息配置,方便程序维护,易于程序开发。
一. ini文件例子
[Setting]
UnitSize=1
TotalUnitNum=4096
[Item_0]
ItemUnitOffset=0
ItemUnitNum=8
ItemBitEnable=0
ItemDesc=Byte0-8: Namespace Size(NSZE)
[Item_1]
ItemUnitOffset=8
ItemUnitNum=8
ItemBitEnable=0
ItemDesc=Byte8-15: Namespace Capacity(NCAP)
...
[Item_7]
ItemUnitOffset=28
ItemUnitNum=1
ItemBitEnable=1
ItemDesc=Byte28: End-to-end Data Protection Capability(DPC)
BitItemNum=1,1,1,1,1,3,NULL
BitItemMethod=1,1,1,1,1,0,NULL
BitItem0_1=PI Type 1 supported
BitItem1_1=PI Type 2 Supported
BitItem2_1=PI Type 3 Supported
BitItem3_1=PI is in first 8 Bytes of metadata
BitItem4_1=Protection Information(PI) is in last 8 bytes of metadata
...
二. Windows下实现方法
Windows下面微软已经帮我们封装了相关的方法,即GetPrivateProfileInt() 和GetPrivateProfileString()(winbase.h)
1. 读取ini文件
GetPrivateProfileInt() 获取整数:
UINT GetPrivateProfileInt(
LPCTSTR lpAppName, // section name
LPCTSTR lpKeyName, // key name
INT nDefault, // return value if key name not found
LPCTSTR lpFileName // initialization file name
);
注意:lpAppName和lpKeyName不区分大小写,当获得integer <0,那么返回0。
GetPrivateProfileString() 获取字符串:
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // section name
LPCTSTR lpKeyName, // key name
LPCTSTR lpDefault, // default string
LPTSTR lpReturnedString, // destination buffer
DWORD nSize, // size of destination buffer
LPCTSTR lpFileName // initialization file name
);
注意:lpAppName和lpKeyName不区分大小写,若lpAppName为NULL,lpReturnedString缓冲区内装载这个ini文件所有小节的列表,若为lpKeyName=NULL,就在lpReturnedString缓冲区内装载指定小节所有项的列表。
2. 写ini文件
WritePrivateProfileString函数,没有写integer的,可以转成string再写入。
BOOL WritePrivateProfileString(
LPCTSTR lpAppName, // section name
LPCTSTR lpKeyName, // key name
LPCTSTR lpString, // string to add
LPCTSTR lpFileName // initialization file
);
The WritePrivateProfileSection function replaces the keys and values for the specified section in an initialization file.
BOOL WritePrivateProfileSection(
LPCTSTR lpAppName, // section name
LPCTSTR lpString, // data
LPCTSTR lpFileName // file name
);
三. Linux下实现方法
linux环境是没有类似Windows下ini专用的api。需要自己程序实现。
1. 实现方法
char line[10240];
FILE* fp = fopen("xxx.ini", "rt");
while((fgets(line)) != NULL)
{
// 将line末尾的\r\n去掉,并去掉起头的空格
代码略
// 如果第一个字符是'[',则作为标题栏目
if(line[0] == '[')
{
// 切分出标题名,代码略
const char* sp = substring(line + 1, line.Length - 2)
... 后续处理
}
// 如果是注释行则跳过
else if(line[0] == ';')
{
}
else
{
// 搜索第一个'='
char* p = strchr(line, '=');
// 如果找到则为内容行
if(p != NULL)
{
*p ++;
char* key = line;
char* value = p;
... 后续处理
}
}
}
fclose(fp);
四. QT跨平台软件实现
Qt中使用QSettings类读取ini后缀的配置文件非常简单。
1. QSettings读取ini文件
QString filePath;
filePath = QCoreApplication::applicationDirPath();
filePath += "myConfig.ini";
QSettings *settings = new QSettings(filePath, QSettings::IniFormat);
QString groupName = QString("Item_%1"). arg(i);
settings->beginGroup(groupName);
int unitOffset = settings->value("ItemUnitOffset").toInt();
int unitNum = settings->value("ItemUnitNum").toInt();
QString desc = settings->value("ItemDesc").toString();
settings->endGroup();
删除和修改ini文件请参考QSettings类。
2. QSettings读取INI配置文件带逗号的问题
当你使用QString desc = settings->value(“ItemDesc”).toString()获取字符串时,如果字符串中有逗号,你会发现最终拿到的值为空。
原因:用逗号隔开后,Qt自动识别为数组。
解决方案:所以单纯用value(“ItemDesc”).toString() 获取的值是空值,必须使用toStringList(),才能正确获取!