4

既存のC++アプリケーションを変更し、現在ハードコーディングされているいくつかの値を移動しています。

これは、このすべてを「管理」map<CString, CString>し、INIファイルの値を保持する1つのクラスで実行しています。

今のところ、::GetPrivateProfileString関数を使用して各値を個別に読み取る必要があります-単一の値ではなく、どういうわけかセクション全体を読み取ることができますか?

ファイルを手動で読み取る必要はありませんが、合理的な(つまり、効率的で使いやすい)既存の方法がある場合は、提案を受け付けています。

編集:ちょうど今それを「実際に」使用する必要があり、ソリューションは実際にlpKeyName値としてNULLを渡していました。戻り値の解析を含む完全なコード:

char buffer[MAX_STRING_SIZE];
int charsCount = ::GetPrivateProfileString("MySection", NULL, NULL, buffer, MAX_STRING_SIZE, m_strIniPath);
CString curValue;
curValue.Empty();
char curChar = '\0';
for (int i = 0; i < charsCount; i++)
{
    curChar = buffer[i];
    if (curChar == '\0')
    {
        if (curValue.GetLength() > 0)
            HandleValue(curValue);
        curValue.Empty();
    }
    else
    {
        curValue.AppendFormat("%c", curChar);
    }
}
if (curValue.GetLength() > 0)
    HandleValue(curValue);

ゼロ文字(EOS?)で区切られたキーを返すので簡単ではないので、上記のようなループを使用してキーを抽出する必要がありました。必要になる可能性のあるすべての人のために、ここで共有してください。:-)

4

3 に答える 3

3

Boost.PropertyTree ( INIパーサーを提供する)の使用を検討する必要があります。

プロパティツリーライブラリは、任意の深さでネストされた値のツリーを格納するデータ構造を提供し、キーによって各レベルでインデックスが付けられます。ツリーの各ノードには、独自の値に加えて、そのサブノードとそのキーの順序付きリストが格納されます。ツリーでは、複数のキーを連結したパスを使用して、任意のノードに簡単にアクセスできます。

さらに、ライブラリは、XML、INI、JSONなど、このようなツリーで表すことができる多くのデータ形式のパーサーとジェネレーターを提供します。

于 2010-12-26T14:16:32.693 に答える
3

ファイルを手動で読む必要はありませんが、GetPrivateProfileStringのマニュアルを読むと役立ちます。

lpKeyName [in] : 関連付けられた文字列を取得するキーの名前。このパラメーターが NULL の場合、lpAppName パラメーターで指定されたセクション内のすべてのキー名が、lpReturnedString パラメーターで指定されたバッファーにコピーされます

于 2010-12-26T15:15:02.437 に答える
2

GetPrivateProfileSection を見ましたか? http://msdn.microsoft.com/en-us/library/ms724348(VS.85).aspx

于 2010-12-26T15:39:59.823 に答える