源码下载:GitHub - brofield/simpleini: Cross-platform C++ library providing a simple API to read and write INI-style configuration files

1.加载simpleini库

下载后解压

simpleini开源库使用-LMLPHP

2.simpleini库的简单使用

(1)加载ini文件

// 定义ini文档对象
CSimpleIniA ini;
 
// 加载ini文件
SI_Error rc;
rc = ini.LoadFile(FILE_NAME);    // 另一种方式:SI_Error LoadFile(FILE * a_fpFile);
if (rc < 0) { 
    printf("加载 %s ini 文件失败!\n", FILE_NAME);
    return -1;
}

rc返回值有以下这些:

using SI_Error = int;
constexpr int SI_OK = 0;        //!< No error
constexpr int SI_UPDATED = 1;   //!< An existing value was updated
constexpr int SI_INSERTED = 2;  //!< A new value was inserted

// note: test for any error with (retval < 0)
constexpr int SI_FAIL = -1;     //!< Generic failure
constexpr int SI_NOMEM = -2;    //!< Out of memory error
constexpr int SI_FILE = -3;     //!< File error (see errno for detail error)

(2)简单配置

// 设置INI数据的存储格式,参数为true时保存为UTF-8格式,否则为本地编码格式
ini.SetUnicode(true);
// 是否允许一个关键字对应多个值,默认为允许;若不允许,则将最后一个值作为此关键字关联的值
ini.SetMultiKey(false);

(3)增

①添加一个新的节点(section)

// 添加一个新的 section
rc = ini.SetValue("section1", nullptr, nullptr);
if (rc < 0) { 
    printf("添加section1失败!\n");
    return -1;
}

②添加一个新的 key和value

// 添加一个新的 key和value
rc = ini.SetValue("section1", "name", "张三");
if (rc < 0) {
    printf("添加name失败!\n");
    return -1;
}
//const char *name = ini.GetValue("section1", "name", "");
//printf("name = %s\n", name);
 
ini.SetValue("section1", "age", "24");
ini.SetValue("section1", "sex", "男");

注意:

还可以使用SetLongValue、SetDoubleValue、SetBoolValue去添加:

(4)改

①修改值(value)

// 修改value,如果键(name)不存在则添加该 key和value
rc = ini.SetValue("section1", "name", "李四");
if (rc < 0) { 
    printf("修改name失败!\n");
    return -1;
}
//const char *name = ini.GetValue("section1", "name");
//printf("name = %s\n", name);

注意:

还可以使用SetLongValue、SetDoubleValue、SetBoolValue去添加:

(5)删

①删除 key 和 value

// 删除 key
// 如果最后一个key也被删除了,那么section也会被一起删除掉
done = ini.Delete("section1", "name");
if (false == done) {
    printf("删除 section1 - name 失败!\n");
    return -1;
}

②删除整个节点(section)和其下的所有键(key)

// 删除整个section和其中的所有键
done = ini.Delete("section1", nullptr);
if (false == done) {
    printf("删除整个section和其中的所有键 失败 !\n");
    return -1;
}

(6)查

①将下图中的ini文件内容读取打印显示

int _int = std::stoi(ini.GetValue("section", "_int", "-1"));
printf("_int = %d\n", _int);
long long _long = std::stoll(ini.GetValue("section", "_long", "-1"));
printf("_long = %lld\n", _long);
double _double = std::stod(ini.GetValue("section", "_double", "0.0"));
printf("_double = %lf\n", _double);
float _float = std::stof(ini.GetValue("section", "_float", "0.0"));
printf("_float = %f\n", _float);
bool _bool = ini.GetBoolValue("section", "_bool", false);
printf("_bool = %s\n", _bool ? "true" : "false");
std::string _string = ini.GetValue("section", "_string", "");
printf("_string = %s\n", _string.c_str());
std::string _string2 = ini.GetValue("section", "_string2", "");
printf("_string2 = %s\n", _string2.c_str());
char _char = ini.GetValue("section", "_char", "")[0];
printf("_char = %c\n", _char);
std::string ip = ini.GetValue("server", "ip", "0.0.0.0");
printf("ip = %s\n", ip.c_str());
int port = std::stoi(ini.GetValue("server", "port", "-1"));
printf("port = %d\n", port);
std::string name1 = ini.GetValue("server", "name", "");
printf("name = %s\n", name1.c_str());

还可以使用GetLongValue、GetDoubleValue、GetBoolValue去查:

int lenght = ini.GetLongValue("server", "length", -1);
double weight = ini.GetDoubleValue("server", "weight", -1);
bool vip = ini.GetBoolValue("server", "vip", false);

②遍历ini文件的所有内容

GetAllSections:获取所有节点,参数一引用返回list链表;

GetSection:根据参数字符串,获取节点,返回multimap容器;

CSimpleIniA::TNamesDepend sections;
// get all sections
ini.GetAllSections(sections);    
// 遍历所有 section 的 key 和 value
for (const auto &it : sections) {
    const CSimpleIniA::TKeyVal *pKeyVal = ini.GetSection(it.pItem);
    if (nullptr != pKeyVal) {
        for (const auto& it : *pKeyVal) {
            std::cout << it.first.pItem << " = " << it.second << std::endl;
        }
    }
}

③遍历所有节点(section)

CSimpleIniA::TNamesDepend sections1;
// 获取所有section
ini.GetAllSections(sections1);
// 遍历所有 sections
for (const auto &it : sections1) {
    std::cout << it.pItem << std::endl;
}

④遍历指定节点的键(key)

GetAllKeys:获取所有键,参数二引用返回list链表;

CSimpleIniA::TNamesDepend keys;
// get all keys in a section
ini.GetAllKeys("section", keys);    
// 遍历 section 指定的所有 key
for (const auto &it : keys) {
    std::cout << it.pItem << std::endl;
}

⑤获取一个键对应多个值

首先,ini.SetMultiKey(true)得设置为true,否则只会获取到最后一个值,其他会被删除掉;在ini文件中的server节点添加多几个name键,使用以下代码获取:

CSimpleIniA::TNamesDepend values;
// 获取 key 所对应的多个 value;ini.SetMultiKey(true);一定要设置为true,
// 否则就只会获取到最后一个,其他删除
ini.GetAllValues("server", "name", values);
// 遍历一个 key 对应多个 value;
for (const auto &it : values) {
    printf("name = %s\n", it.pItem);    
}

⑥获取指定节点(section)里有多少键值

// 获取section里有多少值
int size = ini.GetSectionSize("section");
printf("section 的 key 个数:%d\n", size);

(7)保存

注意:以上增、删、改,只有执行保存代码后,才会在文件做出相应的修改!

①保存到文件

/* 保存到文件中 */ 
rc = ini.SaveFile(FILE_NAME); 
if (rc < 0) { 
    printf("保存 %s ini文件失败\n", FILE_NAME); 
}

②保存到C++字符串

std::string strIni = ""; 
ini.Save(strIni); 
printf("%s\n", strIni.c_str());
02-26 16:35