C/C++ 读取配置文件的几种方式

文章介绍了如何使用protobuf读取配置文件,定义并编译.proto格式配置,以及如何结合gflags管理C++代码中的可配置选项。同时展示了json格式的配置文件示例和在C代码中加载配置文件的过程。
摘要由CSDN通过智能技术生成

1. protobuf

  • 将配置信息读取到string流中
/**
 * @brief 将配置文件读取到string流中
 * 
 * @param file_name :配置文件名称
 * @param content: 读取后的string配置信息流
 * @return true :成功读取
 * @return false:打开文件失败
 */
bool GetContent(const std::string &file_name, std::string *content) {
  // 打开文件流
  std::ifstream fin(file_name);
  if (!fin) {
    return false;
  }
  // 获取流缓冲区 
  std::stringstream str_stream;
  str_stream << fin.rdbuf();
  *content = str_stream.str();
  return true;
}
  • 创建proto格式配置文件(dag_config.proto)
message DAGConfig {
    enum SubnodeType {
        SUBNODE_IN = 1; 
        SUBNODE_OUT = 2;
        SUBNODE_NORMAL = 3;
    };

    // Subnode instance.
    message Subnode {
        required int32 id = 1;
        required string name = 2;
        // node private data.节点私有数据
        optional string reserve = 3;
        optional SubnodeType type = 4 [default = SUBNODE_NORMAL];
    };

    message SubnodeConfig {
        repeated Subnode subnodes = 1;
    };

    message Event {
        required int32 id = 1;
        optional string name = 2;
    };

    message Edge {
        required int32 id = 1;
        required int32 from_node = 2;
        required int32 to_node = 3;
        repeated Event events = 4;
    };

    message EdgeConfig {
        repeated Edge edges = 1;
    }

    message SharedData {
        required int32 id = 1;
        required string name = 2;
    };

    message SharedDataConfig {
        repeated SharedData datas = 1;
    }

    required SubnodeConfig subnode_config = 1;
    required EdgeConfig edge_config = 2;
    required SharedDataConfig data_config = 3;
};
  • 将proto文件编译成.cc和.h文件
  • 使用protobuf的序列化进行配置文件解析
  DAGConfig dag_config;
  string content;
  // 获取内容
  if (!GetContent(dag_config_path, &content)) {
    return false;
  }
  // 解析字符串:使用protobuf的序列化进行配置文件解析,将解析结果放置在dag_config中
  if (!TextFormat::ParseFromString(content, &dag_config)) {
    return false;
  }

2. opencv

3. json

4. gflags

  • 在代码中设置待配置变量(alg_fusConfig.hpp)
#ifndef INTERFACE_FUS_CONFIG_H
#define INTERFACE_FUS_CONFIG_H
#include <gflags/gflags.h>
DEFINE_bool(use_dataAcquisition, false,"Whether to use data acquisition");// FLAGS_use_dataAcquisition
DEFINE_bool(use_ydutool, false,"Whether to use ydutools");// FLAGS_use_ydutool
DEFINE_bool(use_aiCarport, true,"Whether to receive visual parking Spaces");// FLAGS_use_aiCarport
DEFINE_bool(use_ultrasonic, true,"Whether to use ultrasonic radar");// FLAGS_use_ultrasonic


// 输出打印
DEFINE_bool(use_debugPtintf, false,"Whether to use ultrasonic radar"); // FLAGS_use_debugPtintf
DEFINE_bool(ptintf_fusCarportList, false,"Whether to use ultrasonic radar"); // FLAGS_ptintf_fusCarportList
DEFINE_bool(ptintf_fusSelectedCarport, false,"Whether to use ultrasonic radar"); // FLAGS_ptintf_fusSelectedCarport
// 输入打印
DEFINE_bool(ptintf_location, false,"Whether to use ultrasonic radar"); // FLAGS_ptintf_location
DEFINE_bool(ptintf_decision, false,"Whether to use ultrasonic radar"); // FLAGS_ptintf_decision
DEFINE_bool(ptintf_carSpace, false,"Whether to use ultrasonic radar"); // FLAGS_ptintf_carSpace
DEFINE_bool(ptintf_userCarSpace, false,"Whether to use ultrasonic radar"); // FLAGS_ptintf_userCarSpace
DEFINE_bool(ptintf_selectedCarport, false,"Whether to use ultrasonic radar"); // FLAGS_ptintf_selectedCarport
DEFINE_bool(ptintf_ultrarRadar, false,"Whether to use ultrasonic radar"); // FLAGS_ptintf_ultrarRadar
DEFINE_bool(ptintf_fapa, false,"Whether to use ultrasonic radar"); // FLAGS_ptintf_fapa
DEFINE_bool(ptintf_vehicle, false,"Whether to use ultrasonic radar"); // FLAGS_ptintf_vehicle
#endif
  • 创建配置文件(config.conf)
## 数据采集
--use_dataAcquisition=false
--use_ydutool=false
--use_aiCarport=true
--use_ultrasonic=true


## 输出打印
--use_debugPtintf=false
--ptintf_fusCarportList=false
--ptintf_fusSelectedCarport=false

## 输入打印
--ptintf_location=false
--ptintf_decision=false
--ptintf_carSpace=false
--ptintf_userCarSpace=false
--ptintf_selectedCarport=false
--ptintf_ultrarRadar=false
--ptintf_fapa=false
--ptintf_vehicle=false
  • 在C代码中加载配置文件
	// 配置文件所在路径
	std::string config_file = "/ota/SW1.0.06/modules/fusion_carport/config/config.conf";
    if( fusCarportLog::CheckPath(config_file) == 1)// 判断配置文件存不存在
    {
        // 生成ParseCommandLineFlags 的参数支持的数据类型
        std::string stingArray[2];
        stingArray[0] = "fusion_carport";// 一般设置为进程名称,可以是任意字符,ParseCommandLineFlags函数要求一定需要设置
        stingArray[1] = "--flagfile=";
        stingArray[1] = stingArray[1] + config_file;
        int numStrings = sizeof(stingArray) / sizeof(stingArray[0]);
        char* charPtrArray[numStrings];
        for (std::size_t i = 0; i < numStrings; ++i) {
            charPtrArray[i] = new char[stingArray[i].length() + 1];
            std::strcpy(charPtrArray[i], stingArray[i].c_str());
         }
        auto pArgv = &charPtrArray[0];
        gflags::ParseCommandLineFlags(&numStrings, &pArgv, true);

        for (std::size_t i = 0; i < numStrings; ++i) {
            delete[] charPtrArray[i];
        }
    }else{
        printf( "\n-->%s配置文件不存在\n",config_file.c_str());
    }
   

    printf( "\n FLAGS_use_dataAcquisition=%d\n \
                FLAGS_use_ydutool=%d\n \
                FLAGS_use_aiCarport=%d\n \
                FLAGS_use_ultrasonic=%d\n \
                FLAGS_use_debugPtintf=%d\n \
                FLAGS_ptintf_fusCarportList=%d\n \
                FLAGS_ptintf_fusSelectedCarport=%d\n \
                FLAGS_ptintf_location=%d\n \
                FLAGS_ptintf_decision=%d\n \
                FLAGS_ptintf_carSpace=%d\n \
                FLAGS_ptintf_userCarSpace=%d\n \
                FLAGS_ptintf_selectedCarport=%d\n \
                FLAGS_ptintf_ultrarRadar=%d\n \
                FLAGS_ptintf_fapa=%d\n \
                FLAGS_ptintf_vehicle=%d\n \
                ",FLAGS_use_dataAcquisition,FLAGS_use_ydutool,FLAGS_use_aiCarport,FLAGS_use_ultrasonic,FLAGS_use_debugPtintf, \
                FLAGS_ptintf_fusCarportList,FLAGS_ptintf_fusSelectedCarport,FLAGS_ptintf_location,FLAGS_ptintf_decision, \
                FLAGS_ptintf_carSpace, FLAGS_ptintf_userCarSpace,FLAGS_ptintf_selectedCarport,FLAGS_ptintf_ultrarRadar,FLAGS_ptintf_fapa, \
                FLAGS_ptintf_vehicle);

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: INI(Initial Input)配置文件是一种常用的配置文件格式,用于存储和读取程序的配置信息。以下是读写INI配置文件的步骤: 1. 读取INI配置文件:首先,我们需要打开INI配置文件,并逐行读取文件内容。可以使用适当的函数或库来实现文件读取操作。在读取过程中,我们需要解析每一行内容,并提取所需的配置信息。 2. 解析INI配置文件:在解析每一行配置信息之前,我们还需要进行一些校验和处理。首先,我们需要忽略注释行(行首以分号 “;” 或井号 “#” 开头的行),然后我们需要忽略空行。接下来,我们可以使用适当的函数或算法来解析每一行的配置信息。一般来说,每一行配置信息的格式为“键=值”的形式,我们需要提取出键和对应的值。 3. 存储INI配置文件:如果需要修改INI配置文件或添加新的配置项,我们需要打开INI配置文件,并写入新的配置信息。首先,我们需要读取原有的配置信息,并将其保存到内存中。然后,我们可以使用合适的函数或库来修改配置信息或添加新的配置项。最后,我们将修改后的配置信息写入INI配置文件。 4. 错误处理:在读写INI配置文件的过程中,如果遇到错误,例如文件不存在、文件权限不足、文件格式错误等,我们需要进行适当的错误处理。可以根据实际情况输出错误信息或进行其他操作。 总结:读写INI配置文件是一种常见的配置文件操作方法,需要按照一定的步骤进行。通过逐行读取和解析配置文件内容,可以实现读取INI配置文件的功能。通过修改和添加配置信息,并将其写入配置文件,可以实现存储INI配置文件的功能。在进行读写操作时,还需要注意错误处理,以保证程序的稳定性和可靠性。 ### 回答2: INI配置文件是一种常见的配置文件格式,用于存储程序的配置信息。C语言提供了一些函数库用于读写INI文件,包括<Windows.h>头文件中的GetPrivateProfileString、GetPrivateProfileInt、WritePrivateProfileString等函数。 首先,要读取INI配置文件中的值,可以使用GetPrivateProfileString函数。该函数的参数包括INI文件的路径、节名和键名,同时可以传入一个缓冲区,函数将根据配置文件中的键值将对应的值复制到缓冲区中。 另外,如果配置文件中的值是整数类型的,可以使用GetPrivateProfileInt函数,该函数会直接返回键值对应的整数值。 如果需要写入INI配置文件,可以使用WritePrivateProfileString函数。该函数的参数包括INI文件的路径、节名、键名和值。调用该函数后,程序会将键值对按照指定的格式写入配置文件中。 在使用这些函数前,需要先加载Windows.h头文件。同时,在使用INI配置文件时,需要注意配置文件的路径是否正确,以及节名和键名是否正确。读取INI文件时,还要判断读取的值是否为空,以避免出现错误。 总结起来,C语言提供了一些函数用于读写INI配置文件,这些函数可以方便地读取和写入配置信息。通过合理的使用这些函数,可以更好地管理程序的配置,提升程序的可配置性和可维护性。 ### 回答3: INI(Initialization)是一种常见的配置文件格式,用于存储应用程序的设置和参数。在C语言中,可以通过读写INI配置文件来实现配置文件加载和保存。 在读取INI配置文件时,可以使用标准库函数fopen()来打开文件,然后通过fgets()函数逐行读取文件内容。读取到的每一行都可以通过字符串处理函数来分割成键值对。常用的字符串处理函数包括strtok()、strstr()和sscanf()等。使用时需要根据INI配置文件的具体格式和规范来进行相应的处理。 在写入INI配置文件时,可以使用标准库函数fopen()来创建或打开文件,然后使用fprintf()函数来向文件写入内容。需要注意的是,写入INI配置文件时需要按照一定的格式和规范来进行写入,以保证配置文件的正确性和可读性。 读写INI配置文件的步骤主要包括以下几个方面: 1. 打开INI配置文件:使用fopen()函数打开INI配置文件。 2. 读取INI配置文件内容:使用fgets()函数逐行读取配置文件内容,并使用字符串处理函数处理每一行的内容。 3. 解析INI配置文件内容:根据INI配置文件的格式和规范,将每一行的内容解析成键值对,并存储到相应的数据结构中。 4. 关闭INI配置文件:使用fclose()函数关闭INI配置文件,释放资源。 5. 根据需要进行数据操作:根据存储的键值对,进行相应的数据操作,如设置应用程序的参数、初始化等。 6. 写入INI配置文件:使用fprintf()函数向INI配置文件写入数据,按照INI配置文件的格式和规范进行写入。 总结:通过使用C语言提供的标准库函数,可以实现INI配置文件读取和写入。读取时需要逐行读取并解析每一行的内容,写入时需要按照INI配置文件的格式进行写入。读写INI配置文件是一种常见的配置文件处理方式,具有简单、灵活的优点,适用于各种应用程序的配置管理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听雨听风眠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值