C++操作配置文件.ini
1.准备
此次操作*.ini文件用到的工具:simpleini,下载地址:https://github.com/brofield/simpleini。
文件:SimpleIni.h为操作*.ini的主文件,声明和实现都在.h文件中。
文件:ConvertUTF.h、ConvertUTF.c为编码格式转换文件。
2.配置
直接拷贝SimpleIni.h文件到自己工程里即可使用,无需其他操作。
3.介绍
*.ini配置文件是Windows系统配置文件所采用的存储格式,由 节、键 、值组成。示例如下:
;注释
[Section1]//节
Key1=value//key1:键,value:值
Key2=value
... ...
[Section2]
Key1=value
Key2=value
... ...
[server1]
root = 10.1.1.1
root = 10.1.1.2
game = 10.1.1.3
[server2]
root = 10.1.1.1
game = 10.1.1.3
;误差倍数
[ErrorRatio]
;A文件配置
ER1 = 5
ER2 = 5
ER3 = 5
4.(*.ini文件操作)
4.1 读取(*.ini)文件
//*读取(*.ini文件)
void test1(string path)
{
CSimpleIniA ini;
//设置编码格式
ini.SetUnicode();
ini.SetMultiKey();//设置后支持一个键值有多个值
//加载配置文件,将文件数据导入ini类中
ini.LoadFile(path.c_str());
//获取节为:server1,键为:root的值
string res1 = ini.GetValue("server1", "root","def");
//获取节为:server0,键为:root的值,如果节没有返回第三个参数"def"
string res2 = ini.GetValue("server0", "root", "def");
//获取节为:server1,键为:root1的值,如果键没有返回第三个参数"def"
string res3 = ini.GetValue("server1", "root1", "def");
//获取节为:server1,键为:root的值。hasMulti赋值为true,并返回第一个值
//如果一个键值对应多个值,则hasMulti被赋值为true
bool hasMulti;
string res4 = ini.GetValue("server1", "root", "def",&hasMulti);
cout << res1 << endl;
cout << res2 << endl;
cout << res3 << endl;
cout << res4 << endl;
cout << hasMulti << endl;
}
结果:
4.2 写入(*.ini)文件
//*写入(*.ini文件)
void test2(string path)
{
CSimpleIniA ini;
//设置编码格式
ini.SetUnicode();
ini.SetValue("setVal", "key1", "value");
//第二参数最好设置为false,不然保存的(*.ini)文件容易乱码
ini.SaveFile("save.ini",false);
}
结果:
4.3 获取节和键
//获取所有节名和键名
void test3(string path)
{
CSimpleIniA ini;
//设置编码格式
ini.SetUnicode();
//加载配置文件,将文件数据导入ini类中
ini.LoadFile(path.c_str());
//获取所有节名,存储在sections中(list结构)
CSimpleIniA::TNamesDepend sections;
ini.GetAllSections(sections);
//获取节名为:ErrorRatio的所有键名,存储在keys中(list结构)
CSimpleIniA::TNamesDepend keys;
ini.GetAllKeys("ErrorRatio", keys);
cout << "所有节名:" << endl;
for (auto it = sections.begin(); it != sections.end(); it++)
{
cout << (*it).pItem << endl;
}
cout << "节名为:ErrorRatio的所有键名:" << endl;
for (auto it = keys.begin(); it != keys.end(); it++)
{
cout << (*it).pItem << endl;
}
}
输入数据:
结果:
4.4 添加和修改数据
//*添加和修改数据
void test4(string path)
{
CSimpleIniA ini;
//设置编码格式
ini.SetUnicode();
ini.SetMultiKey();//设置后支持一个键值有多个值
//加载配置文件,将文件数据导入ini类中
ini.LoadFile(path.c_str());
//*1.添加新的节
ini.SetValue("newSection", nullptr, nullptr);
//*1.添加新的节、键、值
ini.SetValue("newSection1", "newKey1", "newValue1");
ini.SaveFile("save2.ini", false);
}
输入数据:
结果:
4.5 删除数据
//*删除数据
void test5(string path)
{
CSimpleIniA ini;
//设置编码格式
ini.SetUnicode();
ini.SetMultiKey();//设置后支持一个键值有多个值
//加载配置文件,将文件数据导入ini类中
ini.LoadFile(path.c_str());
//*1.删除节
ini.Delete("server1", nullptr);
//*2.删除键、值
ini.Delete("server2", "game");
ini.SaveFile("save2.ini", false);
}
输入数据:
结果:
4.6 从字符串加载数据,并保存
//*从字符串加载数据,并保存
void test6()
{
CSimpleIniA ini;
//设置编码格式
ini.SetUnicode();
string data = "[section]\nkey = value\nkey1=value1";
ini.LoadData(data);
cout << ini.GetValue("section", "key1", "def") << endl;
ini.SaveFile("save7.ini", false);
}
结果:
4.7 其他
//*其他
void test7(string path)
{
CSimpleIniA ini;
//设置编码格式
ini.SetUnicode();
ini.SetMultiKey();//设置后支持一个键值有多个值
//加载配置文件,将文件数据导入ini类中
ini.LoadFile(path.c_str());
cout << "节:server1是否存在:" << ini.SectionExists("server1") << endl;
cout << "节:server1键的个数:" << ini.GetSectionSize("server1") << endl;
cout <<"节为server1,键为game,是否存在" << ini.KeyExists("server1", "game") << endl;
cout << "节为server1,键为g,是否存在" << ini.KeyExists("server1", "g") << endl;
ini.SaveFile("save3.ini", false);
}
输入数据:
结果: