我有一小段代码,用于读取配置文件,然后根据密钥查找特定的值。我的程序现在看起来像这样:

string readConfigFile(string configKey) {
    cout << "ReadConfigFile\n";
    fstream drConfig("/usr/share/dr_config");
    if(drConfig.is_open()) {
        string line;
        string value;
        while (getline(drConfig, line))
        {
            line.erase(std::remove_if(line.begin(), line.end(), ::isspace), line.end());
            if(line[0] == '#' || line.empty()){
                continue;
            }
            auto delimiterPos = line.find("=");
            auto name = line.substr(0, delimiterPos);
            value = line.substr(delimiterPos + 1);
            // Use this to find a specific string
            if (line.find(configKey) != std::string::npos) {
                cout << value << endl;
            }
        }
        return value;
    } else {
        return "Couldn't open the config file!\n";
    }
}
在我的主要代码中,我这样称呼它:
string num1 = readConfigFile("120");
stringstream geek(num1);
int x = 0;
geek >> x;
cout << "The value of x is " << x << "\n";

string num2 = readConfigFile("100");
stringstream geek(num2);
int y= 0;
geek >> y;
cout << "The value of y is " << y<< "\n";
据称,它应该为我打印出100号数字。但是令人惊讶的是,它打印的是我以前的值120。我认为readConfigFile()方法出了点问题。有人可以指导我吗?我如何获得100的最新值?

最佳答案

实际上,我刚刚找到了答案,一旦我已经找到了代码如下所示的密钥,就应该添加一个break;:

while (getline(drConfig, line))
    {
        line.erase(std::remove_if(line.begin(), line.end(), ::isspace), line.end());
        if(line[0] == '#' || line.empty()){
            continue;
        }
        auto delimiterPos = line.find("=");
        auto name = line.substr(0, delimiterPos);
        value = line.substr(delimiterPos + 1);
        // Use this to find a specific string
        if (line.find(configKey) != std::string::npos) {
            cout << value << endl;
            break;
        }
    }
    return value;
基本上,中断会停止循环,然后返回键的匹配值。

关于c++ - 配置文件解析器仅返回先前的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62708470/

10-13 08:19
查看更多