1

これは、この質問のために私が思いついた簡単なものです。私はこれに完全に満足しているわけではなく、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 ファイルからいくつかの設定文字列を解析するための簡単な方法が欲しいだけです。

4

3 に答える 3

3

// name = valueに空白がない場合はどうなりますか?
//値が引用符で囲まれている場合はどうなりますか?

私はboost::regexを使用して、次のようなすべての異なるタイプの要素に一致させます。

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];
}

正規表現には微調整が必​​要な場合があります。

また、destream.getlineをstd:: getlineに置き換えて、静的なchar配列を削除します。

于 2008-09-29T01:18:10.283 に答える
1

これ:

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

使用しているプラ​​ットフォームに応じて、wstrchr、wcschr、WSTRCHR、またはその他の呼び出しによって単純化する必要があります。

于 2008-09-28T23:32:38.197 に答える
1

// 行を文字列に一度に取得する方法は?

標準の文字列ヘッダーから(非メンバー) getline関数を使用します。

于 2008-09-29T00:26:41.280 に答える