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日

相关文章

  • Hbuilder开发HTML5 APP之创建子页面

    Hbuilder开发HTML5 APP之创建子页面 在Hbuilder中开发HTML5 APP,创建多个页面是必不可少的。创建多个子页面可以更好地组织你的APP结构,丰富你的APP功能,提升用户体验。在本篇文章中,我们将提供详细的步骤指导,教你如何创建一个子页面。 第一步:创建父页面 在Hbuilder中创建父页面相对简单。打开Hbuilder,选择项目文件…

    其他 2023年3月28日
    00
  • JS中this上下文对象使用方式

    JS中的this代表当前函数的执行环境,即当前函数的上下文对象。一个函数的this值是在函数调用时确定的,也就是在运行时动态绑定的。因此,可以灵活地根据调用函数的不同,来指定this的值和作用范围。本文将为您详细讲解JS中this上下文对象的使用方式,包括常规函数和箭头函数,同时提供相应的示例说明。 常规函数中的this 在JS中,函数的this值可以通过4…

    other 2023年6月26日
    00
  • eclipse快速查找某个类的详细教程

    Eclipse快速查找某个类的详细教程攻略 1. 使用快捷键进行查找 在Eclipse中,可以使用快捷键快速查找某个类。以下是使用该方法的步骤: 打开Eclipse并进入相应的工程。 按下快捷键Ctrl + Shift + T(Windows/Linux)或Command + Shift + T(Mac),打开“Open Type”对话框。 在对话框中,输入…

    other 2023年6月28日
    00
  • 微软发布四月更新Win10正式版ISO镜像MSDN下载地址

    微软发布四月更新Win10正式版ISO镜像MSDN下载地址攻略 本攻略将详细介绍如何获取微软发布的四月更新Win10正式版ISO镜像的MSDN下载地址。请按照以下步骤进行操作: 步骤一:访问微软官方网站 首先,打开您的网络浏览器,并访问微软官方网站。您可以在浏览器的地址栏中输入 https://www.microsoft.com ,然后按下回车键。 步骤二:…

    other 2023年8月4日
    00
  • Python递归时间复杂度

    关于Python递归的时间复杂度,我们需要分析两个方面:递归的深度和每层递归的计算量。对于每次递归,Python都需要保存当前函数的状态,包括局部变量、堆栈等信息,这些信息存储在调用栈中,每进入一次递归,调用栈的深度就增加一层。因此,递归的深度会直接影响Python程序的空间复杂度,而递归中每层的计算量则会影响程序的时间复杂度。 递归的时间复杂度通常使用大O…

    other 2023年6月27日
    00
  • C语言全方位讲解数组的使用

    C语言全方位讲解数组的使用 什么是数组 数组是C语言中存储同类型数据的一种数据结构,数组中的元素通过下标来索引,下标从0开始。数组是一个连续的内存块,每个元素占一个相同的存储单元。 声明数组 数组的声明方式为: type arrayName[arraySize]; 其中,type表示数据类型,arrayName表示数组的名称,arraySize表示数组的大小…

    other 2023年6月20日
    00
  • Android嵌套RecyclerView左右滑动替代自定义view

    Android嵌套RecyclerView左右滑动替代自定义view攻略 在Android开发中,有时候我们需要实现一个左右滑动的列表,通常可以使用自定义view来实现。然而,使用嵌套的RecyclerView也可以达到同样的效果,并且更加灵活和易于扩展。本攻略将详细介绍如何使用嵌套的RecyclerView来实现左右滑动列表,并提供两个示例说明。 步骤一:…

    other 2023年7月28日
    00
  • Ajax实现静态刷新页面过程带加载旋转图片

    以下是实现该功能的具体步骤: 第一步:添加一个加载旋转图片 我们可以在页面中添加一个div,通过CSS样式来设置该div的宽、高、背景图片等属性,实现一个加载旋转图片的效果。以下是一个简单的示例代码: <div id="loading"> <img src="loading.gif" alt=&quo…

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