我想从文件中读取键值对,而忽略注释行。
想象一个像:
这样的文件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;
}
}
}
此外,欢迎评论我的代码风格:)
答案 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
。
答案 1 :(得分:1)
看起来不那么糟糕。我只是使用string :: find来查找等号,而不是生成lineStream。然后将索引零的子字符串取到等号位置并修剪它。 (不幸的是,你必须自己编写修剪程序或使用增强程序。)然后取等号后面的子串并修剪它。