读取INI配置文件

10 篇文章 0 订阅
8 篇文章 0 订阅


前言

.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(),才能正确获取!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值