1.加载simpleini库
下载后解压
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());