Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
[ЗАДАЧА] Удаление KV ключей в цикле
_wS_ Дата: Пятница, 21.03.2014, 04:45:53 | Сообщение # 1
Ваш плагин должен:

1. Открыть cstrike/test.txt (его содержимое смотрите ниже - решите оба варианта)
2. Удалить ключи "b", "c", "e" в цикле do/while, используя лишь функции из keyvalues.inc, кроме KvJump функций
3. Сохранить cstrike/test.txt


 
хвостег Дата: Четверг, 08.05.2014, 04:54:13 | Сообщение # 2
Сообщений: 161
Репутация: 53 [ +/- ]
Вот такой костыль

Код

#include <sourcemod>

new Handle:file[128];
new String:DeleteKeys[] = "bce";

public OnMapStart()
{
   Format(String:file, sizeof(file), "addons/sourcemod/cfg/test/%s.cfg", "test2");
     
   new Handle:kv = CreateKeyValues("test");
     
   if(FileToKeyValues(kv, String:file) && KvGotoFirstSubKey(kv, false) )
   {
    decl String:KeyName[2];
      
    do
    {
     if(KvGetSectionName(kv, KeyName, 2))
     {
      for(new I = 0; I < strlen(DeleteKeys); I++)
      {
       decl String:Key[2];
       Format(Key, sizeof(Key), "%c", DeleteKeys[I]);
         
       if(!strcmp(KeyName, Key, false))
       {
        KvDeleteThis(kv);
        KvRewind(kv);
        KvGotoFirstSubKey(kv, false);
          
        break;
       }
      }
     }
    }
    while (KvGotoNextKey(kv, false));
   }
     
   KvRewind(kv);
   KeyValuesToFile(kv, String:file);
   CloseHandle(kv);
}


работает как с первым, так и со вторым тестовым файлом


Сообщение отредактировал хвостег - Четверг, 08.05.2014, 04:55:49
 
_wS_ Дата: Пятница, 09.05.2014, 11:45:12 | Сообщение # 3
хвостег, почти, но не то. Например, если файл будет таким:

Код
"test"  
{  
     "b" "1"
     "c" "1"
     "e" "1"
     "a" "1"
     "d" "1"
}

То ключ 'c' не удалится, его и не проверяет.
Плюс в твоем варианте одни и те же ключи проверяются несколько раз, можно этого избежать.
На вид кажется что эта задачка простая, но нет =)
 
хвостег Дата: Суббота, 10.05.2014, 05:52:39 | Сообщение # 4
Сообщений: 161
Репутация: 53 [ +/- ]
Задачка простая

вся суть - "нашел -> удалил"

Код

#include <sourcemod>

new Handle:file[128];
new String:DeleteKeys[] = "bce";

public OnMapStart()
{
   Format(String:file, sizeof(file), "addons/sourcemod/cfg/test/%s.cfg", "test3");
     
   new Handle:kv = CreateKeyValues("test");
     
   if(FileToKeyValues(kv, String:file) && KvGotoFirstSubKey(kv, false) )
   {
    decl String:KeyName[2];
      
    new bool:NextKey = true;
    new bool:found   = false;
      
    do
    {
     if(KvGetSectionName(kv, KeyName, 2))
     {
      for(new I = 0; I < strlen(DeleteKeys); I++)
      {
       decl String:Key[2];
       Format(Key, sizeof(Key), "%c", DeleteKeys[I]);
         
       if(!strcmp(KeyName, Key, false)) { found = true; break; }
      }
        
       if(found) { NextKey = KvDeleteThis(kv) == 1 ? true : false; found = false; }
       else { NextKey = KvGotoNextKey(kv, false); }
     }
    }
    while(NextKey);
   }
     
   KvRewind(kv);
   KeyValuesToFile(kv, String:file);
   CloseHandle(kv);
}



Сообщение отредактировал хвостег - Суббота, 10.05.2014, 06:20:40
 
_wS_ Дата: Суббота, 10.05.2014, 12:00:45 | Сообщение # 5
Другое дело, молодец =) Нашел/удалил это понятно, просто после удаления позиция смещается и еще понять надо что с этим делать. Я делал немного по-другому, но суть та же:

Код
public OnPluginStart()  
{  
     new Handle:kv = CreateKeyValues("test");
     if (FileToKeyValues(kv, "addons/sourcemod/scripting/test.txt") && KvGotoFirstSubKey(kv, false))
     {
         decl String:info[8];
         do
         {
             TryDeleteKvKey(kv, info, sizeof(info));
         }
         while (KvGotoNextKey(kv, false));
     }
     KvRewind(kv);
     KeyValuesToFile(kv, "addons/sourcemod/scripting/test.txt");
     CloseHandle(kv);
}

TryDeleteKvKey(Handle:kv, String:info[], size)
{
     if (KvGetSectionName(kv, info, size)
         && (info[0] == 'B' || info[0] == 'C' || info[0] == 'E')
         && KvDeleteThis(kv) == 1)
     {
          TryDeleteKvKey(kv, info);
     }
}
 
  • Страница 1 из 1
  • 1
Поиск: