Я сохраняю в 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.
Есть идеи?
Скорее всего, ключ, который вы вставляете в неупорядоченную карту, содержит пробелы (которые вы не видите при выводе) и, следовательно, не найден позже.
В вашем регулярном выражении ^(.+)\\s*=\\s*(.+)
, первый (.+)
будет жадно соответствовать как можно большему числу символов, включая начальные и конечные пробелы. \\s*
следующий за ним всегда будет соответствовать пустой строке. Чтобы предотвратить это, вы можете использовать (\\S+)
только для без пробелов, или используйте не жадный (.+?)
,
Кстати, while (!fs.eof())
неправильно. использование while (std::getline(fs, line)) {...}
вместо.
Других решений пока нет …