C/C++读取配置文件的方式小结

 更新时间:2024年04月10日 08:39:53   作者:听雨听风眠  
这篇文章主要为大家详细介绍了C/C++中读取配置文件的几种常见方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

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);

以上就是C/C++读取配置文件的方式小结的详细内容,更多关于C++读取配置文件的资料请关注脚本之家其它相关文章!

相关文章

  • Qt实现UI界面纯代码示例

    Qt实现UI界面纯代码示例

    这篇文章主要给大家介绍了关于Qt实现UI界面的相关资料,使用Qt纯代码,实现了基本的界面,对大家学习或者使用Qt具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • c语言中的局部跳转及全局跳转功能

    c语言中的局部跳转及全局跳转功能

    本文介绍了C语言中的goto语句,以及如何使用setjmp和longjmp实现跨函数的跳转,详细讲解了setjmp和longjmp的使用方法和注意事项,以及使用这种全局跳转后变量状态的不确定性,感兴趣的朋友一起看看吧
    2024-09-09
  • 利用QT实现图片浏览器的示例详解

    利用QT实现图片浏览器的示例详解

    这篇文章主要和大家分享一个小案例:利用QT制作一个小的图片浏览器,要求可以显示jpg、jpeg、png、bmp,还可以从电脑上拖动图到窗口并显示出来,感兴趣的可以了解一下
    2023-02-02
  • C++类型转换运算符的实例详解

    C++类型转换运算符的实例详解

    这篇文章主要介绍了C++类型转换运算符的实例详解的相关资料,希望通过本文大家能够掌握这部分内容,需要的朋友可以参考下
    2017-09-09
  • 尾递归详细总结分析

    尾递归详细总结分析

    关于递归操作,相信大家都已经不陌生。简单地说,一个函数直接或间接地调用自身,是为直接或间接递归
    2013-09-09
  • C/C++ for 语句的要点与注意事项小结

    C/C++ for 语句的要点与注意事项小结

    C/C++ 中的 for 语句是一种常用的循环结构,用于重复执行一段代码,直到满足某个条件为止,这篇文章主要介绍了C/C++ for 语句的要点与注意事项,需要的朋友可以参考下
    2024-06-06
  • C++项目实战之makefile使用

    C++项目实战之makefile使用

    这篇文章主要介绍了C++项目实战之makefile使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Effective C++ 入门学习笔记

    Effective C++ 入门学习笔记

    这篇文章主要介绍了Effective C++ 入门学习笔记,需要的朋友可以参考下
    2023-08-08
  • 关于C++面向对象设计的访问性问题详解

    关于C++面向对象设计的访问性问题详解

    这篇文章主要给大家介绍了关于C++面向对象设计的访问性问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • C++ BloomFilter布隆过滤器应用及概念详解

    C++ BloomFilter布隆过滤器应用及概念详解

    布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中
    2023-03-03

最新评论