C++读取INI配置文件类实例详解

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技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 关于VS2022不能使用的解决方案(万能头文件)

    首先,需要了解使用头文件的背景和原理。这个头文件是GCC编译器自带的一个头文件,包含了STL的所有内容,使用起来非常方便,但是在其他编译器中可能会出现问题。而VS2022属于微软公司的C++编译器,不支持此头文件。 那么如何解决这个问题呢? 一、使用STL标准头文件代替 可以使用STL标准头文件来代替头文件,例如: #include <iostream…

    other 2023年6月27日
    00
  • 关于树:使用和理解matlab的treebagger(随机森林)方法

    以下是关于“关于树:使用和理解matlab的treebagger(随机森林)方法”的完整攻略,包含两个示例说明。 什么是随机森林 随机森林是一种集成学习方法,它由个决策树组成。每个决策树都是基于随机选择的特征和样本构建的。随机森林可以用于回归问题,并且具有很好的准确性和鲁棒性。 使用treebagger函数 在MATLAB中,我们可以使用treebagger…

    other 2023年5月9日
    00
  • Element Dialog对话框的使用示例

    Element Dialog对话框的使用示例攻略 Element Dialog是一个常用的对话框组件,用于在网页中展示弹出式的对话框。下面是一个详细的攻略,包含了Element Dialog的使用示例和说明。 步骤一:引入Element UI库和样式 首先,确保你已经引入了Element UI库和样式。你可以通过以下方式在你的HTML文件中引入它们: &lt…

    other 2023年7月28日
    00
  • WPF自定义路由事件的实例教程

    WPF自定义路由事件的实例教程 什么是WPF自定义路由事件 在WPF中,路由事件是一种事件路由方式,它可以让事件沿着逻辑树传递,从而到达触发事件的元素树的根目录。相比起普通的事件,路由事件具有更强大的扩展性。 WPF自定义路由事件就是利用路由事件机制,创建一个自定义的路由事件。 自定义路由事件的步骤 第一步:创建自定义路由事件的类 首先,我们需要创建一个继承…

    other 2023年6月25日
    00
  • spring中bean的生命周期详解

    这里给出 “spring中bean的生命周期详解” 的完整攻略: 什么是Bean的生命周期? 在 Spring 中,当一个 Bean 被创建出来并可以被容器使用时,会经历以下几个状态,这些状态构成了一个 Bean 的生命周期: Bean 的实例化 Bean 的属性设置 Bean 的初始化 Bean 的销毁 下面我们来详细讲解每个状态。 Bean 的实例化 在…

    other 2023年6月27日
    00
  • Java集合的Collection接口和List接口详解

    Java集合的Collection接口和List接口详解 Collection接口概述 Java中的集合类是用来存储和操作一组对象的类。它们可以在必要的时候自动增长或缩小,很容易添加或删除对象,而无需考虑数组的长度问题。Java的集合框架提供了一组接口、实现类和算法,可以轻松地处理集合中的元素。其中,Collection是所有集合类的祖先接口。 Collec…

    other 2023年6月27日
    00
  • Android开发之高德地图实现定位

    Android开发之高德地图实现定位攻略 简介 本攻略将详细介绍如何在Android应用中使用高德地图实现定位功能。高德地图是一款功能强大的地图服务,提供了准确的定位功能,可以帮助开发者快速实现定位功能。 步骤 步骤一:添加依赖库 首先,在你的Android项目中添加高德地图的依赖库。在项目的build.gradle文件中添加以下代码: dependenci…

    other 2023年8月23日
    00
  • Android编程之include文件的使用方法

    Android编程之include文件的使用方法攻略 在Android编程中,我们经常会使用include文件来重用布局和视图组件。include文件允许我们在一个布局文件中引用另一个布局文件,从而实现代码的复用和模块化。下面是使用include文件的完整攻略,包含两个示例说明。 步骤一:创建被引用的布局文件 首先,我们需要创建一个被引用的布局文件,即将被重…

    other 2023年8月26日
    00
合作推广
合作推广
分享本页
返回顶部