Ошибка восстановления значений из boost :: unordered :: unordered_map с использованием ключей std :: string

Я сохраняю в 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 — это имя «переменной» в файле конфигурации. станд :: соиЬ << m [1] .str () показывает это отлично, но не найдено в unordered_map.
Есть идеи?

0

Решение

Скорее всего, ключ, который вы вставляете в неупорядоченную карту, содержит пробелы (которые вы не видите при выводе) и, следовательно, не найден позже.

В вашем регулярном выражении ^(.+)\\s*=\\s*(.+), первый (.+) будет жадно соответствовать как можно большему числу символов, включая начальные и конечные пробелы. \\s* следующий за ним всегда будет соответствовать пустой строке. Чтобы предотвратить это, вы можете использовать (\\S+) только для без пробелов, или используйте не жадный (.+?),

Кстати, while (!fs.eof()) неправильно. использование while (std::getline(fs, line)) {...} вместо.

2

Другие решения

Других решений пока нет …