C/C++讀取配置文件的方式小結(jié)
1. protobuf
將配置信息讀取到string流中
/**
* @brief 將配置文件讀取到string流中
*
* @param file_name :配置文件名稱(chēng)
* @param content: 讀取后的string配置信息流
* @return true :成功讀取
* @return false:打開(kāi)文件失敗
*/
bool GetContent(const std::string &file_name, std::string *content) {
// 打開(kāi)文件流
std::ifstream fin(file_name);
if (!fin) {
return false;
}
// 獲取流緩沖區(qū)
std::stringstream str_stream;
str_stream << fin.rdbuf();
*content = str_stream.str();
return true;
}創(chuàng)建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.節(jié)點(diǎn)私有數(shù)據(jù)
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的序列化進(jìn)行配置文件解析
DAGConfig dag_config;
string content;
// 獲取內(nèi)容
if (!GetContent(dag_config_path, &content)) {
return false;
}
// 解析字符串:使用protobuf的序列化進(jìn)行配置文件解析,將解析結(jié)果放置在dag_config中
if (!TextFormat::ParseFromString(content, &dag_config)) {
return false;
}
2. opencv
3. json
4. gflags
在代碼中設(shè)置待配置變量(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
創(chuàng)建配置文件(config.conf)
## 數(shù)據(jù)采集 --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 的參數(shù)支持的數(shù)據(jù)類(lèi)型
std::string stingArray[2];
stingArray[0] = "fusion_carport";// 一般設(shè)置為進(jìn)程名稱(chēng),可以是任意字符,ParseCommandLineFlags函數(shù)要求一定需要設(shè)置
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++讀取配置文件的方式小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于C++讀取配置文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(97.交織相錯(cuò)的字符串)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(97.交織相錯(cuò)的字符串),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++?線(xiàn)段樹(shù)原理與實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了C++?線(xiàn)段樹(shù)原理與實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷游戲
這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下<BR>2022-01-01
C語(yǔ)言中帶頭雙向循環(huán)鏈表基本操作的實(shí)現(xiàn)詳解
無(wú)頭單向非循環(huán)鏈表結(jié)構(gòu)簡(jiǎn)單,一般不會(huì)單獨(dú)用來(lái)存數(shù)據(jù)。而帶頭雙向循環(huán)鏈表的結(jié)構(gòu)較為復(fù)雜,一般用在單獨(dú)存儲(chǔ)數(shù)據(jù)。本文將介紹帶頭雙向循環(huán)鏈表的基本操作,需要的可以參考一下2022-11-11
Qt開(kāi)發(fā)實(shí)現(xiàn)跨窗口信號(hào)槽通信
這篇文章主要為大家詳細(xì)介紹了Qt開(kāi)發(fā)實(shí)現(xiàn)跨窗口信號(hào)槽通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

