0

正規表現の一致から得た結果を 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 << m[1].str() はそれを完全に示していますが、unordered_map には見つかりません。何か案は?

4

1 に答える 1

2

ほとんどの場合、順序付けされていないマップに配置したキーには空白が含まれているため (出力時には表示されません)、後で検出されません。

あなたの正規表現^(.+)\\s*=\\s*(.+)では、最初のもの(.+)は、先頭と末尾の空白を含め、できるだけ多くの文字に貪欲に一致します。以下\\s*は、常に空の文字列に一致します。これを防ぐには、(\\S+)for non-whitespace only を使用するか、non-greedy を使用し(.+?)ます。

ところで、while (!fs.eof())間違っています。while (std::getline(fs, line)) {...}代わりに使用してください。

于 2013-02-21T11:28:45.933 に答える