:: GetPrivateProfileString прочитать весь раздел файла INI - PullRequest
4 голосов
/ 26 декабря 2010

Я изменяю существующее приложение C ++ и удаляю некоторые значения, которые в настоящее время жестко запрограммированы.

Я делаю это с одним классом, который будет "управлять" всем этим и хранить map<CString, CString> значений из файла INI.

Сейчас я должен читать каждое значение отдельно, используя функцию ::GetPrivateProfileString - могу ли я как-то прочитать весь раздел вместо одного значения?

Предпочитают не читать файл вручную, но если есть какой-либо разумный (то есть эффективный + простой в использовании) существующий способ, которым я открыт для предложений.

Редактировать: только что пришлось использовать его «по-настоящему», и решение действительно передавало NULL в качестве значения lpKeyName . Полный код, включая анализ возвращаемого значения:

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?), Поэтому мне пришлось извлечь их, используя цикл, подобный описанному выше - поделиться им здесь для всех, кому это может понадобиться. : -)

Ответы [ 3 ]

3 голосов
/ 26 декабря 2010

Вам не нужно читать файл вручную, но это помогает прочитать руководство для GetPrivateProfileString :

lpKeyName [in]: имя ключа чья связанная строка должна быть извлекаться. Если этот параметр равен NULL, все имена ключей в указанном разделе параметром lpAppName копируются в буфер, указанный Параметр lpReturnedString .

3 голосов
/ 26 декабря 2010

Возможно, вам следует рассмотреть возможность использования Boost.PropertyTree (который обеспечивает INI-парсер ):

Библиотека дерева свойств предоставляет структура данных, которая хранит произвольно глубоко вложенное дерево значения, проиндексированные на каждом уровне некоторыми ключ. Каждый узел дерева хранит свои собственное значение плюс упорядоченный список его подузлы и их ключи. Дерево обеспечивает легкий доступ к любому из его узлов посредством пути, который является объединение нескольких ключей.

Кроме того, библиотека предоставляет парсеры и генераторы для ряда форматы данных, которые могут быть представлены таким деревом, включая XML, INI, и JSON.

2 голосов
/ 26 декабря 2010

Вы смотрели на GetPrivateProfileSection? http://msdn.microsoft.com/en-us/library/ms724348(VS.85).aspx

...