PDA

Просмотр полной версии : [Include] MxINI



Dima_Turkow
05.01.2014, 19:58
Инклуд MxINI

Это инклуд, содержащий функции для чтения/записи файлов.

Оформление файла


Любая строка не имеющая символа "=" будет считаться комментарием;

Вокруг ключа, символа "=" и до зачения ключа может быть любое кол-во пробелов;

Нет лимитов на длину ключа и его значения;

Поддержка всех символов(в том числе и кирилице) в названии файла, ключе и его значении, кроме "\r" и "\n";

Одна строка может содержать любое кол-во пар ключ/значение;

Пример:

а = б = в
эта строка фактически содержит след. ключи и значения:
"а" = "б"
"а = б" = "в"
"а" = "б = в"
"б" = "в"


Скорость

Перед тем как читать что-то из файла, его также как и остальные файлы нужно открыть. При открытии весь файл копируется в ОЗУ вместе с именем. Остальные операции чтения/записи производятся непосредственно в ОЗУ. Именно поэтому все это происходит очень быстро. Если контент файла в ОЗУ был изменен, при закрытии он будет записан на диск.
Используется сжатое хранение контента файла, что в 4 раза меньше, чем обычный формат(в обычной строке для 1 символа отводится 4 байта, в сжатой строке 1 символ занимает всего 1 байт). Скорость также достигается за счет отсутствия дополнительных функций, которые могли бы использоваться в функциях чтения/записи, а также за счет использования только встроенных функций скриптинга.


Функции инклуда

Создание файла:

ini_createFile("адрес/файла.ini", "Содержимое файла по умолчанию");
//или
ini_createFile("адрес/файла.ini");
//создаст файл если его нету, иначе вернет код ошибки

Открытие файла:

ini_openFile("путь/к/файлу.ini");//откроет файл если он сущ-ет, иначе вернет код ошибки

Закрытие/сохранение файла:

ini_closeFile(ID_открытого_файла);

Запись текста в файл:

ini_setString(ID_открытого_файла, "имя ключа", "текстовое значение");

Запись числа в файл:

ini_setInteger(ID_открытого_файла, "имя ключа", 123456);

Запись float значения в файл:

ini_setFloat(ID_открытого_файла, "имя ключа", 3.1416);

Чтение текста из файла:

ini_getString(ID_открытого_файла, "имя ключа", returnValue);

Чтение числа из файла:

ini_getInteger(ID_открытого_файла, "имя ключа", returnValue);

Чтение float значения из файла:

ini_getFloat(ID_открытого_файла, "имя ключа", returnValue);

Удаление ключа из файла:

ini_removeKey(ID_открытого_файла, "имя ключа");

Вернуть код ошибки:

ini_removeKey(ID_открытого_файла, "имя ключа");

Доп. Функции, потребующиеся для работы (DEFAULT):
Проверка на существование файла:

fexist("адрес/файла.ini");

Удаление файла:

fremove("адрес/файла.ini");

Также можно добавить пару дефайнов:

#define ini_existFile fexist
#define ini_removeFile fremove

Для удобства использования, например:

ini_existFile("адрес/файла.ini");//Проверка на существование файла
ini_removeFile("адрес/файла.ini");//Удаление файла

Дополнительные нестандартные функции которые могут пригодиться (DEFAULT):

#define ini_setBool(%1,%2,%3) %3?ini_setInteger(%1,%2,1):ini_setInteger(%1,%2,0)
stock ini_getBool(fileID,key[],&bool:Value)
{
new testint;
ini_getInteger(fileID,key,testint);
if(testint == 0) Value = false;
else Value = true;
return true;
}

C помощью этих функций вы сможете записать/прочитать из файла бинарные значения(true & false).
Пример:

new file = ini_createFile("тест_инклуда.ini");
new returnString[32], returnNumber, Float: returnFloat;

ini_setString(file, "ключ со строкой", "текстовое значение");
ini_setInteger(file, "ключ с числом", 123456);
ini_setFloat(file, "ключ с дробью", 3.1416);

ini_getString(file, "ключ со строкой", returnString);
ini_getInteger(file, "ключ с числом", returnNumber);
ini_getFloat(file, "ключ с дробью", returnFloat);

ini_closeFile(file);

printf ( "\n `ключ_со_строкой` = `%s`,\n `ключ_с_числом` = `%d`,\n `ключ_с_дробью` = `%f` \n",
returnString, returnNumber, returnFloat);

Регистрация с помощью mxINI:

public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp("/mycommand", cmdtext, true, 10) == 0)
{
return 1;
}
if(strcmp( cmdtext, "/register", true, 9) == 0)// если игрок ввел в чате /register
{
new FileName[30];GetPlayerName(playerid, FileName, 30);// узнаем ник игрока
format(FileName, 30, "%s.ini", FileName);

if(fexist(FileName)) return SendClientMessage(playerid, 0xFF00000AA, " * Этот аккаунт уже зарегистрирован! Выбери другой ник.");// если файл для этого ника уже существует
if(cmdtext[9] == 0 || cmdtext[10] == 0) return SendClientMessage(playerid, 0xFF00000AA, " * Не указан пароль! Формат: /register пароль");// если не указан пароль

new File = ini_createFile(FileName);// создадим файл с именем игрока

if (File >= 0) // если файл создан
{
ini_setString(File, "Пароль", cmdtext[10]);
ini_closeFile(File);
SendClientMessage( playerid, 0x00FF00AA, " * Аккаунт успешно зарегистрирован! Используй /login, чтобы войти в него." );
return 1;
}else{
// если не удалось создать файл
SendClientMessage( playerid, 0xFF00000AA, " * Не удалось создать файл для аккаунта! Попробуй еще раз. " );
printf("%s", ini_getErrorInfo(File));//выведем описание ошибки в лог
return 1;
}
}
if(strcmp( cmdtext, "/login", true, 6) == 0)// если игрок ввел в чате /register
{
new FileName[30];GetPlayerName(playerid, FileName, 30);// узнаем ник игрока
format(FileName, 30, "%s.ini", FileName);

if(!fexist(FileName)) return SendClientMessage(playerid, 0xFF00000AA, " * Этот аккаунт не зарегистрирован! Введите /register пароль.");// если файл для этого ника не существует
if(cmdtext[6] == 0 || cmdtext[7] == 0) return SendClientMessage(playerid, 0xFF00000AA, " * Не указан пароль! Формат: /login пароль");// если не указан пароль

new File = ini_openFile(FileName);// откроем файл с именем игрока
ini_getString(File, "Пароль", FileName);
ini_closeFile(File);
if(strcmp(cmdtext[7], FileName, true, 10) == 0)
{
SendClientMessage( playerid, 0x00FF00AA, " * Вы успешно вошли.");
}else return SendClientMessage(playerid, 0xFF00000AA, " * Не верный пароль!");
}
return 0;
}
Тест скорости между инклудами (Dini VS Fini VS MxINI):
Каждой библиотеке нужно будет создать и открыть INI файл, записать в него 100 ключей, прочесть значения этих ключей, закрыть файл. Для точных показаний, тест проходит 5 раз подряд.


Все показания в миллисекундах (1 секунда = 1000 миллисекунд (ms)
http://s58.radikal.ru/i161/1103/38/c72fedfde23a.png
http://s54.radikal.ru/i145/1103/54/82978ec95aed.png


<Ссылки на скачивание временно удалены. \\DC>

TWIX
05.01.2014, 20:35
Перемещено!

По теме полезно!

Dima_Turkow
05.01.2014, 20:43
Спасибо )

Salvacore
13.05.2014, 00:45
Update.

bred
13.05.2014, 00:48
Посты набиваем?

Salvacore
13.05.2014, 00:58
Посты набиваем?
Раздел оформляем, перезаливаем, редактируем чужие фейлы.

DeimoS
13.05.2014, 05:15
1)

#define ini_setBool(%1,%2,%3) %3?ini_setInteger(%1,%2,1):ini_setInteger(%1,%2,0)
stock ini_getBool(fileID,key[],&bool:Value)
{
new testint;
ini_getInteger(fileID,key,testint);
if(testint <= 0) Value = false;//false - нуль. Все значения, отличные от нуля - true.
else Value = true;
return true;
}
2) Тема оформлена странно. Особенно если на тёмном стиле смотреть...

Salvacore
13.05.2014, 08:39
1)

#define ini_setBool(%1,%2,%3) %3?ini_setInteger(%1,%2,1):ini_setInteger(%1,%2,0)
stock ini_getBool(fileID,key[],&bool:Value)
{
new testint;
ini_getInteger(fileID,key,testint);
if(testint <= 0) Value = false;//false - нуль. Все значения, отличные от нуля - true.
else Value = true;
return true;
}
2) Тема оформлена странно. Особенно если на тёмном стиле смотреть...

Тогда не было тёмного стиля.

DeimoS
13.05.2014, 15:03
Таки измените <= на "=="

Dima_Turkow
18.08.2014, 15:48
Update

Daniel_Cortez
10.07.2016, 15:24
http://pro-pawn.ru/showthread.php?14029

Очень важно для тех, кто использует mxINI

mxINI читает файл посимвольно и не учитывает перенос строки для имени ключа. Это значит, что игрок может зайти под ником Money=9999999999 и получить 9999999999 денег после регистрации и, естественно, это работает с любым параметром (уровень, права администратора и т.п.).

Пришлось выпустить версию с исправлением этой ошибки, найти её можно на GitHub (https://github.com/Open-GTO/mxINI).