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日

相关文章

  • win10的ip地址在哪里修改?win10的ip地址设置操作方法

    Win10的IP地址修改攻略 在Win10操作系统中,你可以通过以下步骤修改IP地址: 打开“网络和Internet设置”: 点击任务栏右下角的网络图标。 在弹出的菜单中,点击“网络和Internet设置”。 进入“网络和Internet设置”页面: 在“网络和Internet设置”页面中,点击左侧的“更改适配器选项”。 打开网络适配器设置: 在“更改适配器…

    other 2023年7月29日
    00
  • 解决SpringBoot webSocket 资源无法加载、tomcat启动报错的问题

    下面是解决SpringBoot WebSocket资源无法加载、Tomcat启动报错的问题的完整攻略。 首先,检查pom文件中是否有正确的依赖。WebSocket需要两个依赖,分别是spring-boot-starter-websocket和javax.websocket-api。可以在pom.xml文件中添加: <dependency> &lt…

    other 2023年6月25日
    00
  • Win7系统怎么还原exe程序打开方式?

    没问题,请看下面的详细攻略: Win7系统怎么还原.exe程序打开方式 背景 在 Windows 7 系统中,有时候我们会遇到 exe 程序不能正常打开的情况。例如,双击 exe 程序的时候系统提示“找不到应用程序打开文件”等错误。这种问题的原因可能是系统默认打开方式被误修改了,导致 exe 程序无法打开。那么,如何还原 exe 程序的打开方式呢? 解决方法…

    other 2023年6月25日
    00
  • BeanUtils.copyProperties复制属性失败的原因及解决方案

    BeanUtils.copyProperties复制属性失败的原因及解决方案 在Java的开发过程中,我们经常需要将一个对象的属性赋值给另外一个对象。BeanUtils.copyProperties是一个常用的工具类,它的作用是将源对象的属性复制到目标对象中。但有时候在使用该方法进行属性复制时,会出现复制失败的情况,那么这是什么原因?下面我们就来详细讲解一下…

    other 2023年6月27日
    00
  • Python编程中对super函数的正确理解和用法解析

    Python编程中对super函数的正确理解和用法解析 在Python编程过程中,我们通常会涉及到类的继承,而使用super函数可以使得我们在子类中更简单地调用父类的方法,同时避免硬编码。 super函数的基本语法 super函数用于调用父类的方法,其基本语法如下: class ChildClass(ParentClass): def __init__(se…

    other 2023年6月27日
    00
  • android ndk程序获取外置SD沙盒目录的方法讲解

    Android NDK程序获取外置SD沙盒目录的方法讲解 在Android NDK程序中,要获取外置SD卡的沙盒目录,可以按照以下步骤进行: 首先,确保你的应用已经声明了读取外部存储的权限。在AndroidManifest.xml文件中添加以下权限声明: <uses-permission android:name=\"android.perm…

    other 2023年9月7日
    00
  • Windows Server 2008 r2服务器无故自动重启故障的解决方法

    Windows Server 2008 r2服务器无故自动重启故障的解决方法 如果你的 Windows Server 2008 r2 服务器出现无故自动重启的故障,下面是一些可能的解决方法: 1. 安全模式启动 考虑安全模式启动,这样可以启动少量驱动程序和服务,有可能可以避免系统崩溃和重启。按下 F8 键来进入高级启动选项,在这里选择 Safe Mode。如…

    other 2023年6月27日
    00
  • 如何做手机文件自动备份的cmd命令行

    下面就是如何做手机文件自动备份的cmd命令行的完整攻略: 准备工作 首先需要安装ADB工具(Android Debug Bridge),可以从 官网 下载并安装。 手机需要开启USB调试模式,并通过USB连接到电脑。 命令行操作 打开Windows命令行窗口(Win+R键后输入cmd并回车)。 使用以下命令查看连接的Android设备是否已经被识别: adb…

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