帮助改善这个INI解析代码(Help improve this INI parsing code)

2019-10-17 16:05发布

这是一些简单的我想出了这个问题 。 我不是这完全高兴,我认为这是一个机会,以帮助提高我使用STL和流编程基础的。

std::wifstream file(L"\\Windows\\myini.ini");
if (file)
{
  bool section=false;
  while (!file.eof())
  {
    std::wstring line;
    std::getline(file, line);
    if (line.empty()) continue;

    switch (line[0])
    {
      // new header
      case L'[':
      {
        std::wstring header;
        size_t pos=line.find(L']');
        if (pos!=std::wstring::npos)
        {
          header=line.substr(1, pos);
          if (header==L"Section")
            section=true;
          else
            section=false;
        }
      }
  break;
      // comments
      case ';':
      case ' ':
      case '#':
      break;
      // var=value
      default:
      {
        if (!section) continue;

// what if the name = value does not have white space?
// what if the value is enclosed in quotes?
        std::wstring name, dummy, value;
        lineStm >> name >> dummy;
        ws(lineStm);
        WCHAR _value[256];
        lineStm.getline(_value, ELEMENTS(_value));
        value=_value;
      }
    }
  }
}

如何改善呢? 请不要推荐备选库 - 我只是想从一个INI文件中解析出一些配置字符串的简单方法。

Answer 1:

//如果名称=值没有空格什么?
//如果值是用引号括起来呢?

我会用的boost ::正则表达式来匹配每个不同类型的元素,是这样的:

boost::smatch matches;
boost::regex name_value("(\S+)\s*=\s*(\S+)");
if(boost::regex_match(line, matches, name_value))
{
    name = matches[1];
    value = matches[2];
}

正则表达式可能需要一些调整。

我也对的std ::函数getline取代德stream.getline,摆脱静态字符数组的。



Answer 2:

这个:

for (size_t i=1; i<line.length(); i++)
        {
          if (line[i]!=L']')
            header.push_back(line[i]);
          else
            break;
        }

应该通过调用简化为wstrchr,wcschr,WSTRCHR,还是别的什么,取决于你是什么平台上。



Answer 3:

//如何获得线进入一气呵成的字符串?

使用(非成员) 函数getline从标准字符串头功能。



文章来源: Help improve this INI parsing code
标签: c++ stl stream ini