C++读取INI配置文件类实例详解
简介
INI是一种配置文件格式,常见于Windows操作系统。INI配置文件可以包含多个节(section),每个节包含多个键值对(key=value)。本文介绍如何使用C++读取INI格式的配置文件,并提供一个可以直接使用的INI读取类。
代码实现
INI读取类的实现
#include <iostream>
#include <fstream>
#include <cstring>
#include <map>
class INIReader {
public:
INIReader(const char* filename);
std::string Get(std::string section, std::string name, std::string default_value = "");
private:
std::map<std::string, std::map<std::string, std::string>> values_;
};
INIReader::INIReader(const char* filename) {
std::ifstream file(filename);
std::string line;
std::string section;
while (std::getline(file, line)) {
if (line.empty()) {
continue;
}
if (line[0] == ';') {
continue;
}
if (line[0] == '[' && line[line.size() - 1] == ']') {
section = line.substr(1, line.size() - 2);
continue;
}
size_t pos = line.find('=');
if (pos == std::string::npos) {
continue;
}
std::string name = line.substr(0, pos);
std::string value = line.substr(pos + 1);
values_[section][name] = value;
}
}
std::string INIReader::Get(std::string section, std::string name, std::string default_value) {
if (values_.count(section) == 0) {
return default_value;
}
if (values_[section].count(name) == 0) {
return default_value;
}
return values_[section][name];
}
INI读取类的使用
#include "inireader.h"
int main() {
INIReader reader("config.ini");
std::string host = reader.Get("database", "host", "127.0.0.1");
int port = std::stoi(reader.Get("database", "port", "3306"));
std::string username = reader.Get("database", "username", "");
std::string password = reader.Get("database", "password", "");
// do something with host, port, username and password
return 0;
}
INI文件格式
INI文件由多个节(section)组成,每个节(section)包含多个键值对(key=value)。
- 节的标识符由方括号括起来:
[section]
- 键值对以等号分隔:
key=value
- 注释以分号开头:
;comment
INI文件示例:
; comment1
[section1]
key1=value1
key2=value2
[section2]
key1=value1
key2=value2
示例说明
示例1
假设有一个配置文件config.ini,包含以下内容:
[database]
host=127.0.0.1
port=3306
username=root
password=123456
我们想要在C++程序中读取这个配置文件,并获取数据库连接所需的信息。
首先,我们需要编写一个INI读取类,并在程序中使用该类读取配置文件中的值。
INI读取类的实现代码请见上文。
使用INI读取类的示例代码如下:
INIReader reader("config.ini");
std::string host = reader.Get("database", "host", "127.0.0.1");
int port = std::stoi(reader.Get("database", "port", "3306"));
std::string username = reader.Get("database", "username", "");
std::string password = reader.Get("database", "password", "");
上述代码首先创建了一个INIReader对象,并指定要读取的配置文件名。然后,通过Get()函数读取了配置文件中的值,并将其赋值给相应的变量。
示例2
假设我们需要在C++程序中读取多个INI配置文件,并将它们合并为一个配置。
假设有两个配置文件config1.ini和config2.ini,它们各自包含以下内容:
config1.ini:
[database]
host=127.0.0.1
port=3306
username=root
password=123456
config2.ini:
[server]
host=192.168.0.1
port=8080
我们需要将这两个配置文件的内容合并为一个配置,并在程序中使用该配置。
首先,我们需要编写一个INI读取类,并在程序中使用该类读取两个配置文件中的值。然后,将读取的值合并到一个map数据结构中,并在合并完成后使用该map数据结构。
INI读取类的实现代码请见上文。
读取两个配置文件的代码示例:
std::map<std::string, std::string> values;
INIReader reader1("config1.ini");
values["database.host"] = reader1.Get("database", "host", "127.0.0.1");
values["database.port"] = reader1.Get("database", "port", "3306");
values["database.username"] = reader1.Get("database", "username", "");
values["database.password"] = reader1.Get("database", "password", "");
INIReader reader2("config2.ini");
values["server.host"] = reader2.Get("server", "host", "127.0.0.1");
values["server.port"] = reader2.Get("server", "port", "8080");
上述代码首先创建了一个空的map对象,然后依次读取了两个配置文件的值,并将其保存在map对象中。
最后,我们可以使用这个map对象,例如:
std::cout << "database.host: " << values["database.host"] << std::endl;
std::cout << "database.port: " << values["database.port"] << std::endl;
std::cout << "database.username: " << values["database.username"] << std::endl;
std::cout << "database.password: " << values["database.password"] << std::endl;
std::cout << "server.host: " << values["server.host"] << std::endl;
std::cout << "server.port: " << values["server.port"] << std::endl;
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++读取INI配置文件类实例详解 - Python技术站