【问题标题】:Error recovering values from boost::unordered::unordered_map using std::string keys使用 std::string 键从 boost::unordered::unordered_map 恢复值时出错
【发布时间】:2013-02-06 16:48:19
【问题描述】:

我将我从正则表达式匹配中获得的结果存储在 unordered_map 中。 std::cout sub 匹配 m[1].str() 并且 m[2].str() 正确显示了键值对。

虽然当我将它们存储在 unordered_map 中时,我总是收到一个异常报告,报告找不到密钥。这是代码:

boost::unordered::unordered_map<std::string, std::string>
loadConfigFile(std::string pathToConfFile) throw(std::string){
    std::fstream fs;
    fs.open(pathToConfFile.c_str());
    if(!fs)
        throw std::string("Cannot read config file.");

    boost::unordered::unordered_map<std::string, std::string> variables;

    while(!fs.eof())
    {
        std::string line;
        std::getline(fs, line);
        //std::cout << line << std::endl;
        boost::regex e("^(.+)\\s*=\\s*(.+)");
        boost::smatch m; //This creates a boost::match_results
        if(boost::regex_match(line, m, e)){
            std::cout << m[1].str() << " " << m[2].str() << std::endl;
            variables[m[1].str()] = m[2].str();
        }
    }
    std::cout << variables.at(std::string("DEPOT_PATH")) << std::endl; //Here I get the exception

    return variables;
}

DEPOT_PATH 是配置文件中“变量”的名称。 std::cout

【问题讨论】:

    标签: c++ boost boost-regex boost-unordered


    【解决方案1】:

    您在无序映射中放入的键很可能包含空格(在输出时您看不到),因此以后找不到。

    在您的正则表达式^(.+)\\s*=\\s*(.+) 中,第一个(.+) 将贪婪地匹配尽可能多的字符,包括前导和尾随空格。紧随其后的\\s* 将始终匹配一个空字符串。为防止这种情况,您可以将(\\S+) 仅用于非空白,或使用非贪婪的(.+?)

    顺便说一句,while (!fs.eof()) 是错误的。请改用while (std::getline(fs, line)) {...}

    【讨论】:

    • 两双眼睛明显比一只眼睛好。 2小时努力修复错误,我需要刷新我的正则表达式知识,非常感谢:)
    猜你喜欢
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 2012-05-23
    • 2013-05-04
    • 2018-05-13
    • 1970-01-01
    相关资源
    最近更新 更多