从文件中读取键值对并忽略#个注释行

时间:2015-06-28 19:29:18

标签: c++ parsing

我想从文件中读取键值对,而忽略注释行。

想象一个像:

这样的文件
key1=value1
#ignore me!

我想出了这个,

a)看起来非常笨重而且

b)如果'='没有空格包围,它就不起作用。 lineStream未正确拆分,整行被读入“key”。

    std::ifstream infile(configFile);
    std::string line;
    std::map<std::string, std::string> properties;

    while (getline(infile, line)) {
        //todo: trim start of line
        if (line.length() > 0 && line[0] != '#') {
            std::istringstream lineStream(line);
            std::string key, value;
            char delim;
            if ((lineStream >> key >> delim >> value) && (delim == '=')) {
                properties[key] = value;
            }
        }
    }

此外,欢迎评论我的代码风格:)

2 个答案:

答案 0 :(得分:6)

我必须制作一些读取配置文件并最近存储它的值的​​解释器,这就是我这样做的方式,它忽略了以#开头的行:

   typedef std::map<std::string, std::string> ConfigInfo;
    ConfigInfo configValues;
    std::string line;
        while (std::getline(fileStream, line))
        {
            std::istringstream is_line(line);
            std::string key;
            if (std::getline(is_line, key, '='))
            {
                std::string value;
                if (key[0] == '#')
                    continue;

                if (std::getline(is_line, value))
                {
                    configValues[key] = value;
                }
            }
        }

fileStream正在成为文件的fstream

部分来自https://stackoverflow.com/a/6892829/1870760

答案 1 :(得分:1)

看起来不那么糟糕。我只是使用string :: find来查找等号,而不是生成lineStream。然后将索引零的子字符串取到等号位置并修剪它。 (不幸的是,你必须自己编写修剪程序或使用增强程序。)然后取等号后面的子串并修剪它。