C/C++讀取配置文件的方式小結(jié)
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; } // 獲取流緩沖區(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é)點私有數(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的序列化進行配置文件解析
DAGConfig dag_config; string content; // 獲取內(nèi)容 if (!GetContent(dag_config_path, &content)) { return false; } // 解析字符串:使用protobuf的序列化進行配置文件解析,將解析結(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ù)類型 std::string stingArray[2]; stingArray[0] = "fusion_carport";// 一般設(shè)置為進程名稱,可以是任意字符,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é)的詳細內(nèi)容,更多關(guān)于C++讀取配置文件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++ Qt開發(fā)之CheckBox多選框組件的用法詳解
Qt是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點介紹CheckBox單行輸入框組件的使用方法,需要的朋友可以參考下2023-12-12Linux系統(tǒng)下C語言gets函數(shù)出現(xiàn)警告問題的解決方法
這篇文章主要給大家介紹了關(guān)于在Linux系統(tǒng)下C語言gets函數(shù)出現(xiàn)警告問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-12-12Linux網(wǎng)絡(luò)編程之socket文件傳輸示例
這篇文章主要介紹了Linux網(wǎng)絡(luò)編程之socket文件傳輸示例,對于基于Linux平臺的C程序員來說有一定的借鑒價值,需要的朋友可以參考下2014-08-08