Узнать количество параметров и их значения

Тема в разделе "Программирование / Скриптинг", создана пользователем R1KO, 17 сен 2013.

  1. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.000
    Симпатии:
    2.992
    Каким образом можно узнать количество параметров и их значения (string) в ключе в Keyvalues ?
     
  2. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    R1KO нравится это.
  3. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    892
    Симпатии:
    659
    R1KO
    Покажи пример небольшой файла
     
  4. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.000
    Симпатии:
    2.992
    The End Is Near...,
    PHP:
    public OnMapStart() 
    {
        
    ClearArray(g_Name);
        
    ClearArray(g_SteamID);
        
    ClearArray(g_IP);
        
    ResetSettings();
        
        new 
    Handle:hKVReasons;
        
        
    hKVReasons CreateKeyValues("SourceBans");
        
    decl String:strBuffer[256];
        
    BuildPath(Path_SMstrBuffersizeof(strBuffer), "configs/sourcebans/sourcebans.cfg");
        
        if(
    FileToKeyValues(hKVReasonsstrBuffer))
        {
            
    KvJumpToKey(hKVReasons"BanReasons"false);

            do
            {
                
    // тут нужно получать параметры.
            
    }
            while (
    KvGotoNextKey(hKVReasons));
        }
        
    CloseHandle(hKVReasons);
    }
    sourcebans.cfg
     
  5. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    892
    Симпатии:
    659
    KvGotoFirstSubKey -> KvGotoNextKey -> KvGetSectionName(kv, section, sizeof(section)) -> KvJumpToKey(kv, section, false) -> KvGetString
    Пробуй так
     
    R1KO нравится это.
  6. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.000
    Симпатии:
    2.992
    The End Is Near..., ты меня не понял, мне нужно получить параметры внутри ключа, а не ключи.
     
  7. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    238
    Симпатии:
    569
    Как ни странно, но ответ на этот вопрос есть на оффициальной вики, в разделе работы с KeyValues. Сам не до конца понимаю, как оно работает, но кидаю пример кода, который шарит по всем ключам и секциям в KV.
    Код:
    BrowseKeyValues(Handle:kv)
    {
    	do
    	{
    		// You can read the section/key name by using KvGetSectionName here.
     
    		if (KvGotoFirstSubKey(kv, false))
    		{
    			// Current key is a section. Browse it recursively.
    			BrowseKeyValues(kv);
    			KvGoBack(kv);
    		}
    		else
    		{
    			// Current key is a regular key, or an empty section.
    			if (KvGetDataType(kv, NULL_STRING) != KvData_None)
    			{
    				// Read value of key here (use NULL_STRING as key name). You can
    				// also get the key name by using KvGetSectionName here.
    			}
    			else
    			{
    				// Found an empty sub section. It can be handled here if necessary.
    			}
    		}
    	} while (KvGotoNextKey(kv, false));
    }
    
    Полагаю, что основная суть такова:
    1. Прыгаем в нужную нам секцию.
    2. Идем к её FirstKey.
    3. Дальше с помощью do ... while (KvGoNextKey) просматриваем как SectionName название всех ключей (можно и их число посчитать).
    Если нужно дальше изъять их значения, то в шаге три я обычно записываю в массив названия всех ключей, а потом делаю шаг один, и уже в массиве названия всех ключей, значит тупо for (new i = 0; i < ArraySize; i++) KvGet... ();

    P.S. Подобным образом можно считывать Kv с вложением более трех уровней.
     
    Danyas, KorDen и R1KO нравится это.
  8. KorDen

    KorDen Atra esterní ono thelduin! Ньюсмейкер

    Сообщения:
    2.194
    Симпатии:
    1.398
    Т.е. пытаться рассматривать ключи как секции? oO
     
  9. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    238
    Симпатии:
    569
    KorDen, что-то типа того...
    Сначала сбор название всех ключей, рассматривая их как секции, а дальше, зная названия ключей секции, получать их значения.
    Таким образом, можно считывать значения из кв файла, не зная заранее ни названий ключей, ни названия секций. А можно читать кв вида
    Код:
    "somekv"
    {
    	"level1"
    	{
    		"level2"
    		{
    			"key1"	"value1"
    		}
    	}
    }
    и не только, уровень вложенности по сути уже может быть любым.
     
    Danyas и KorDen нравится это.