下面是“C++读写INI配置文件的类实例”的完整攻略:
一、背景介绍
INI配置文件是一种常见的文本配置文件格式,它使用Section和Key-Value键值对来存储配置信息,广泛应用于各种软件中。在C++开发中,我们可以通过读写INI配置文件的方式来实现软件的配置管理,方便快捷。
二、INI配置文件的基本格式
INI配置文件的基本格式是由Section和Key-Value键值对构成的,具体如下:
[Section1]
Key1=Value1
Key2=Value2
[Section2]
Key3=Value3
Key4=Value4
其中,[Section]
表示一个Section节点,它下面的Key=Value
对则是该Section节点下面的键值对。
三、实现INI配置文件读写的类
为了方便读写INI配置文件,我们可以封装一个Config类,实现INI配置文件的读写操作。具体实现如下:
1. Config类的定义
#pragma once
#include <string>
#include <map>
class Config {
public:
Config() = default;
// 加载INI配置文件
bool load(const std::string& filename);
// 保存INI配置文件
bool save(const std::string& filename);
// 获取指定Section节点下的指定Key的Value值
std::string get(const std::string& section, const std::string& key, const std::string& defaultValue = "");
// 设置指定Section节点下的指定Key的Value值
void set(const std::string& section, const std::string& key, const std::string& value);
private:
// 解析INI配置文件
bool parse();
private:
std::string m_filename; // INI配置文件名
std::map<std::string, std::map<std::string, std::string>> m_data; // 解析后的数据,使用map存储
};
2. Config类的方法实现
1) load
方法
bool Config::load(const std::string& filename) {
m_filename = filename;
return parse();
}
load
方法用于加载INI配置文件,将配置文件中的数据解析后存储到m_data
中。
2) save
方法
bool Config::save(const std::string& filename) {
m_filename = filename;
std::ofstream file(m_filename);
if (!file.is_open()) {
return false;
}
for (auto& section : m_data) {
file << "[" << section.first << "]" << std::endl;
for (auto& kv : section.second) {
file << kv.first << "=" << kv.second << std::endl;
}
file << std::endl;
}
file.close();
return true;
}
save
方法用于保存INI配置文件,将m_data
中的数据保存到指定的文件中。
3) get
方法
std::string Config::get(const std::string& section, const std::string& key, const std::string& defaultValue) {
if (m_data.count(section) && m_data[section].count(key)) {
return m_data[section][key];
}
return defaultValue;
}
get
方法用于获取指定Section节点下的指定Key的Value值,如果Key不存在则返回默认值。
4) set
方法
void Config::set(const std::string& section, const std::string& key, const std::string& value) {
m_data[section][key] = value;
}
set
方法用于设置指定Section节点下的指定Key的Value值,如果Section节点或Key不存在则会创建它们。
5) parse
方法
bool Config::parse() {
std::ifstream file(m_filename);
if (!file.is_open()) {
return false;
}
m_data.clear();
std::string line, section;
while (std::getline(file, line)) {
line = trim(line);
// 判断是否为注释行
if (line.empty() || line[0] == '#' || line[0] == ';') {
continue;
}
// 解析Section节点
if (line[0] == '[' && line[line.size() - 1] == ']') {
section = line.substr(1, line.size() - 2);
continue;
}
// 解析Key-Value键值对
auto pos = line.find('=');
if (pos == std::string::npos) {
continue;
}
auto key = trim(line.substr(0, pos));
auto value = trim(line.substr(pos + 1, line.size() - pos - 1));
m_data[section][key] = value;
}
file.close();
return true;
}
parse
方法用于解析INI配置文件,将配置文件中的数据解析后存储到m_data
中。
3. Config类的辅助函数
为了方便地对INI配置文件进行解析和处理,我们还可以定义一些辅助函数。
1) trim
函数
std::string trim(const std::string& str) {
std::string result = str;
auto pos = result.find_first_not_of(" \t\r\n");
if (pos == std::string::npos) {
return "";
}
result.erase(0, pos);
pos = result.find_last_not_of(" \t\r\n");
if (pos != std::string::npos) {
result.erase(pos + 1);
}
return result;
}
trim
函数用于去掉字符串前后的空格、制表符和换行符等空白符号。
四、实例说明
以下是两条示例说明,分别演示Config类的读写INI配置文件的基本用法。
1. 示例:读取INI配置文件
假设我们有一个配置文件config.ini,它的内容如下:
[Database]
host=127.0.0.1
port=3306
user=root
password=123456
dbname=testdb
我们可以使用以下代码读取该配置文件的内容:
#include <iostream>
#include "Config.hpp"
int main() {
Config config;
if (!config.load("config.ini")) {
std::cout << "Load config file failed." << std::endl;
return -1;
}
auto host = config.get("Database", "host", "localhost");
auto port = config.get("Database", "port", "3306");
auto user = config.get("Database", "user", "");
auto password = config.get("Database", "password", "");
auto dbname = config.get("Database", "dbname", "");
std::cout << "Host: " << host << std::endl;
std::cout << "Port: " << port << std::endl;
std::cout << "User: " << user << std::endl;
std::cout << "Password: " << password << std::endl;
std::cout << "DBName: " << dbname << std::endl;
return 0;
}
运行上面的代码,输出结果如下:
Host: 127.0.0.1
Port: 3306
User: root
Password: 123456
DBName: testdb
可以看到,我们成功从配置文件读取到了相应的配置信息。
2. 示例:写入INI配置文件
同样假设我们有一个配置文件config.ini,它的内容如下:
[Database]
host=localhost
port=3306
user=root
password=123456
dbname=testdb
我们可以使用以下代码修改该配置文件中的内容:
#include <iostream>
#include "Config.hpp"
int main() {
Config config;
if (!config.load("config.ini")) {
std::cout << "Load config file failed." << std::endl;
return -1;
}
config.set("Database", "host", "127.0.0.1");
config.set("Database", "port", "8888");
config.set("Database", "user", "admin");
config.set("Database", "password", "654321");
if (!config.save("config.ini")) {
std::cout << "Save config file failed." << std::endl;
return -1;
}
return 0;
}
运行上面的代码后,我们可以看到配置文件config.ini中的内容已经被修改为以下内容:
[Database]
host=127.0.0.1
port=8888
user=admin
password=654321
dbname=testdb
可以看到,我们成功地通过Config类实现了INI配置文件的读写操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++读写INI配置文件的类实例 - Python技术站