使用std :: string键从boost :: unordered :: unordered_map恢复值时出错

时间:2013-02-21 11:21:12

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

我在unordered_map中存储从正则表达式匹配中得到的结果。 std :: cout子匹配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&lt;&lt; m [1] .str()完美地显示它,但在unordered_map中找不到。 有什么想法吗?

1 个答案:

答案 0 :(得分:2)

最有可能的是,放在无序地图中的密钥包含空格(输出时没有看到),因此以后找不到。

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

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