前提・実現したいこと
<faces> <face id='0'> <bounds x='41' y='49' width='426' height='426'/> <right-eye x='161' y='208'/> <left-eye x='336' y='208'/> <features s-avg='0.76' s-min='0.40' s-max='0.93'> <point id='PR' x='167' y='204' s='0.86'/> <point id='PL' x='334' y='207' s='0.77'/> <point id='BR2' x='222' y='151' s='0.40'/> </features> </face> </faces> このようなxmlファイルのidとxの値とyの値をコマンドプロンプトに表示したいと思っています. visual studioのc++で行っています.
発生している問題・エラーメッセージ
ビルドは出来るのですが,デバッグをすると ハンドルされない例外が 0x00007FFDACAAF218 で発生しました (RBF.exe 内): Microsoft C++ の例外: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::property_tree::ptree_bad_path> > (メモリの場所 0x00000053470FF268)。 と表示されてしまいます.
該当のソースコード
c++
1struct Book { 2 std::string id; 3 std::string x; 4 5 Book() {} 6 7 Book(const Book& other) 8 : id(other.id), x(other.x) {} 9 10 Book(const std::string& id, const std::string& x) 11 : id(id), x(x) {} 12 13 void print() const 14 { 15 std::cout << id << "," << x << std::endl; 16 } 17}; 18 19 20void load(const std::string& filename) 21{ 22 using boost::property_tree::ptree; 23 24 std::vector<Book> books; 25 26 ptree pt; 27 read_xml(filename, pt); 28 29 foreach(const ptree::value_type& child_, pt.get_child("faces.face.features")) { 30 const ptree& child = child_.second; 31 const std::string id = child.get<std::string>("<xmlattr>.id"); 32 const std::string x = child.get<std::string>("<xmlattr>.x"); 33 34 books.push_back(Book(id, x)); 35 } 36 37 std::for_each(books.begin(), books.end(), boost::mem_fn(&Book::print)); 38} 39int main(int argc, char *argv[]) 40{ 41 load("parts.xml"); 42 return 0; 43 44}
試したこと
xmlファイルの名前が間違ったりしてないか何度も確認したり,xだけboost::optional<int>型にしてみたりしましたが上手くいきません.
xmlを扱うこと自体初めてで,c++も初心者なのでかみ砕いて教えていただけるとありがたいです.
printfでどこまで通っているか試したところ,void loadの
const ptree& child = child_.second;までは通っているので
const std::string id = child.getstd::string("<xmlattr>.id")
に問題があるようです.
よろしくお願いします.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/08 05:27
2018/11/08 06:01
2018/11/08 06:56
2018/11/08 07:08 編集
2018/11/08 08:12