昨天因為需要讀取配置文件略略傷神。網上很多例子但是我用都會報錯,很多人把Boost.PropertyTree的函數寫很麻煩的包所以報錯我也不知道什么問題,所以今天整理下。
頭上附上官網鏈接:Boost C++庫 因為別人的代碼再用的順手都是別人的思路,有不明白還是官網最好理解
然后分享和分析下我的代碼:
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
//定義初始化
boost::property_tree::ptree m_pt, tag_setting; read_ini("/home/feixiao/catkin_ws/src/uhf_rfid_api/config/template_config.txt.in", m_pt); tag_setting = m_pt.get_child(tagname); int x = tag_setting.get<int>("pos_x",20); int y = tag_setting.get<int>("pos_y",20); std::cout << x << y<<std::endl;
首先,boost::property_tree::ptree m_pt, tag_setting;創建對象,這句話放在初始化聲明里。
然后,read_ini("/home/feixiao/catkin_ws/src/uhf_rfid_api/config/template_config.txt.in", m_pt);讀取你要讀取的路徑和文件名,m_pt是將要讀取這個文件的對象。看到別人博客里面有給read_ini前面加包名這樣寫的boost::property_tree::ini_parser::read_ini(ini_file, m_pt);我開始直接粘過去編譯一直通不過,后來去掉就可以了不知為何。
這句,tag_setting = m_pt.get_child(tagname);因為ini文件是分很多section的,tagname就是【】中的名字,告訴系統是讀取這一塊。注意,tag_setting這時候讀到的是ini的一塊內容。
接着,int x = tag_setting.get<int>("pos_x",20);
int y = tag_setting.get<int>("pos_y",20);這兩句就是讀取tagname塊中的具體值啦,參數pos_x是ini文件的變量名,后面的20是如果在配置文件中沒有找到這個變量則默認20這個值。
最后,讀取就可以啦std::cout << x << y<<std::endl;
根據官網的意思,似乎讀xml和Json也是一樣的,但是函數和頭文件名里的ini就好相應的改變啦。
對了,最后附上我的ini:
[e2004000780c002212709894] pos_x = 30 pos_y = 40 [e2004000780c00221450823d] pos_x = 50 pos_y = 20 [aaaabbbb3333444412410000] pos_x = 01 pos_y = 90
/*------------------------------------------------------------------------可愛的分割線---------------------------------------------------------------------------*/
剛剛加了寫入功能代碼+講解:
tag_setting.clear(); //不清除的話新的標簽默認會繼承上一個標簽中的內容
tag_setting.put<int>("pos_x",666); m_pt.put_child(tagname,tag_setting); //寫入新的標簽,如果標簽名一樣,會修改你前一個的內容,如果不一樣就會在下面新加一個 write_ini("/home/feixiao/catkin_ws/src/uhf_rfid_api/config/template_config.txt.in", m_pt);
第一句tag_setting.put<int>("pos_x",666);改變pos_x變量的值。
后一句,如果名字跟前面的一樣,會改變前面的值,否則會新生成一個。
下面兩個不解釋了,試了下add_child,有問題。
另附鏈接:boost函數庫