You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Boost XML解析:如何将文件路径作为变量传入read_xml()?

解决Boost read_xml()无法识别Windows完整路径的问题

这问题我之前踩过坑!核心原因是Windows路径里的反斜杠在C++字符串中是转义字符,你直接写"C:\Users\serhan.erkovan\Desktop\ddd.xml"时,编译器会把\s、\D这类组合当成转义序列处理,导致实际传给read_xml()的路径已经被篡改,自然找不到文件。

下面给你几个靠谱的解决方案:

方案1:用双反斜杠转义路径

在C++字符串里,要表示一个实际的反斜杠,必须写成两个反斜杠\\,这样编译器才会把它解析成单个路径分隔符:

ptree pt;
try {
    read_xml("C:\\Users\\serhan.erkovan\\Desktop\\ddd.xml", pt);
} catch (const boost::property_tree::xml_parser::xml_parser_error &ex) {
    cerr << ex.what();
}

方案2:用C++11+的原始字符串(推荐)

如果觉得双反斜杠写起来麻烦,可以用C++11引入的原始字符串语法,前面加R并用括号包裹内容,里面的反斜杠不需要转义:

ptree pt;
try {
    read_xml(R"(C:\Users\serhan.erkovan\Desktop\ddd.xml)", pt);
} catch (const boost::property_tree::xml_parser::xml_parser_error &ex) {
    cerr << ex.what();
}

方案3:改用正斜杠作为路径分隔符

Windows系统完全支持正斜杠/作为路径分隔符,这样既不用转义,代码还能兼容Linux/macOS等其他平台:

ptree pt;
try {
    read_xml("C:/Users/serhan.erkovan/Desktop/ddd.xml", pt);
} catch (const boost::property_tree::xml_parser::xml_parser_error &ex) {
    cerr << ex.what();
}

把路径存成变量传入的正确写法

如果要把路径放到变量里再传入,只要按照上面的任意一种方式定义变量即可:

#include <string>
// ...
std::string xml_file_path = "C:\\Users\\serhan.erkovan\\Desktop\\ddd.xml";
// 或者用原始字符串:std::string xml_file_path = R"(C:\Users\serhan.erkovan\Desktop\ddd.xml)";
// 或者正斜杠:std::string xml_file_path = "C:/Users/serhan.erkovan/Desktop/ddd.xml";

ptree pt;
try {
    read_xml(xml_file_path, pt);
} catch (const boost::property_tree::xml_parser::xml_parser_error &ex) {
    cerr << ex.what();
}

另外补充一句:你直接传"ddd.xml"能运行,是因为程序的工作目录正好和文件所在目录一致(比如你在Desktop目录下运行程序),但这种写法不通用,换个目录运行就会报错,所以还是用完整路径更稳妥。

内容的提问来源于stack exchange,提问作者Serhan Erkovan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 17:09:06