Это немного очистку старой системы в INI YSI. Не так много на самом деле изменилось, только несколько исправляет ошибку и добавили поддержку tagless файлов INI, таких как файлы Дини.
Я буду в ближайшие дни выпустить пользователей системы, основанной на этом, а также обертки, чтобы режимы использования Дини, чтобы воспользоваться улучшенной чтения и письма.
Обновление
* Исправлено несколько ошибок. * Подчистили код в чтении и письме функций. * Добавлена чтения и записи, для наговора, BOOL и бинарные. * Это обновление устраняет проблемы с запятой "INI_Int" и т.д. - это означает, что вы должны иметь точку с запятой. Это также означает, что вы теперь должны иметь возвращения в конце вашего груза функции.
Скачать
Эта библиотека является частью YSI, которую можно найти здесь. Держите глаза на эту тему, и сервер журнала обновлений. Используйте
Для использования этого просто включите заголовок:
Code
#include <YSI\y_ini>
Чтение
Эта система отличается в использовании весьма существенно от Дини, но по уважительной причине. В Дини вы открываете файл, поиск одного значения, читал, что значение, закройте файл и повторите. Представьте себе этот код:
Если вы не можете сказать, что будет открывать и закрывать файл в 3 раза и читать 6 строк в, только за 3 значения - ведь вы должны просто открыть файл раз и читать 3 линии? Это эквивалентно код y_ini:
Code
INI:myini[](name[], value[]) { INI_String("a", gA); INI_String("b", gB); INI_String("c", gC); return 0; // This is now required. }
Code
INI_Load("myini.ini");
Код немного дольше, но это намного быстрее, только чтение файлов сразу. Esentially y_ini использует обратные вызовы для загрузки файлов вместо явного чтения отдельных значений, что означает, файлы читаются в порядке, они хранятся. Я намерен добавить возможность загружать отдельные значения позже, но редко какой-либо необходимости, если вы делаете вещи правильно - прочитать файл и получить данные, он не собирается менять, если вы не измените его.
Синтаксис файла также немного странным, но мы придем к этому позже.
Обратите внимание, что двоеточие в конце раньше ошибка, это теперь не так.
Дать
y_ini пишет значения в очень похоже на Дини, хотя вы явно открывать и закрывать файл - Дини открывает и закрывает его на каждое значение. Кроме того, он буферов пишет - вам не нужно беспокоиться о точности, как она работает, это просто означает, что он пишет много значений одновременно.
Другая особенность в yini не в Дини теги в INI-файлы:
Code
[LVDM] health = 4.23 pos = 2500 1968 7.3
[SFTDM] health = 100 pos = -2134 -980 2
Если у вас есть два режима (или даже только две библиотеки) в Дини, любой пользователь системы будет необходимо использовать отдельные файлы для каждого из них. А здесь данные различных режимах "разделены по тегам (бит в квадратных скобках). Это где нечетные синтаксис читать функции вошел
* Чтение
Чтобы прочитать только в LVDM данных вы могли бы сделать:
* INI_Int Название [] - название INI текстовой идентификатор. переменная - переменная для хранения в.
Макрос для облегчения загрузки целых чисел из файла INI. Данные передаются на загрузку обратного вызова в виде строки, это будет преобразовать его в целое (с использованием sscanf если это возможно, нормальных функций, если нет) и сохранить в данной переменной. Сначала проверяет, что имя данных прошли матчи имя. Обратите внимание, что для этого макроса работать переменные должны называться "имя" и "значение". Примеры:
# INI_Float Название [] - название INI текстовой идентификатор. переменная - переменная для хранения в.
Сохраняет переданное значение, как поплавок, если имя совпадает.
# INI_Hex Название [] - название INI текстовой идентификатор. переменная - переменная для хранения в.
Сохраняет переданное значение как рубить номер, если имя совпадает.
# INI_Bin Название [] - название INI текстовой идентификатор. переменная - переменная для хранения в.
Сохранение номера в форме 0b1001101 (двоичные), если имя совпадает.
# INI_Bool Название [] - название INI текстовой идентификатор. переменная - переменная для хранения в.
Сохраняет переданное значение как логическое (истина / ложь), если имя совпадает.
# INI_String Название [] - название INI текстовой идентификатор. переменная - переменная для хранения в. длина - Длина массива назначения.
Сохраняет прошло значения в виде строки, если имя совпадает.
# INI_Load Файл [] - файл для загрузки. BOOL: Bextra - Отправить дополнительных данных. дополнительные - дополнительные данные для отправки. bLocal - Call локальных функций вместо gloabal них.
Считывает файл целиком. Все, кроме имени файла не является обязательным.
Примеры:
Загрузок данный файл:
Code
INI_Load(filename);
Загружает указанный файл и передает функции загрузки дополнительных данных (например Player ID):
Code
INI_Load(filename, true, playerid);
Code
INI:filename[tag](playerid, name[], value[]) { }
Загрузите файл INI, и отправить уже загруженных данных для всех запуск сценариев:
Code
INI_Load(filename, .bLocal = false);
Загрузите файл INI, и отправить уже загруженных данных для всех запуск сценариев:
Code
INI_Load(filename, .bLocal = false);
* INI_Open Файл [] - INI-файл, чтобы открыть.
Открывает INI-файл для записи. Возвращает ручка с тега типа "INI:".
* INI_Close INI: файл - дескриптор INI, чтобы закрыть.
Закрывает настоящее время записывается в файл.
* INI_SetTag INI: Файл - INI-файл ручкой для записи. Тег [] - название нового подраздела файл для последующего данные для записи.
Устанавливает новые [теги] раздел заголовка. Последующие данные записываются под этим заголовком.
* INI_RemoveEntry INI: Файл - Файл для записи. Название [] - Предмет удалить.
Удаляет запись из текущего тега текущего файла.
* INI_WriteString INI: Файл - Файл для записи. Название [] - Данные имя. данных [] - Данные.
Создать строку в текущей INI.
* INI_WriteInt INI: Файл - Файл для записи. Название [] - Данные имя. данных - Integer данных.
Создать Int на текущий INI.
* INI_WriteHex INI: Файл - Файл для записи. Название [] - Данные имя. данных - Integer данных.
Создать Int на текущий INI как шестнадцатеричное значение (0x1F182).
* INI_WriteBool INI: Файл - Файл для записи. Название [] - Данные имя. данные - логическое данных.
Создать Boolean (истина / ложь) в текущем INI.
* INI_WriteBin INI: Файл - Файл для записи. Название [] - Данные имя. данных - Integer данных.
Создать Int на текущий INI в двоичном формате (0b1001010).
* INI_WriteFloat INI: Файл - Файл для записи. Название [] - Данные имя. Поплавок: данные - Float данных. Точность - число знаков после запятой, чтобы написать.
Создать всплывают на текущий INI.
Расширенный
Существует одна функция, не обозначенные выше, которая вызывает функцию INI_Load:
* INI_ParseFile Файл [] - файл для загрузки. remoteFormat [] - Какую функцию для вызова. BOOL: bFileFirst - Что для формата функции. BOOL: Bextra - Отправить дополнительных данных. дополнительные - дополнительные данные для отправки. bLocal - Call локальных функций вместо gloabal них. BOOL: bPassTag - Какие дополнительные данные для передачи.
Эта функция заслуживает раздел для себя самого.
Часто, чтобы прочитать в файлах "INI_Load" будет делать, но это весьма ограничительный в какие функции он вызывает. Если у вас есть файлы пользователей на основе их название вам потребуется функция для каждого пользователя, однако, что, очевидно, невозможно, так что вы хотите удалить файл из вызываемой функции. Это где "remoteFormat", "bFileFirst" и "bPassTag" параметры входите
remoteFormat - определяет формат функция для вызова, в стандартном "формате" структуры. Есть две строки параметров может потребоваться - текущее имя файла и текущий тег в файле. Например, если у вас есть функция, определенная как:
Code
forward User_LVDM(name[], value[]); public User_LVDM(name[], value[])
Вы должны установить "remoteFormat" на:
Code
"User_%s"
Первая% s. текущего тега, второй S% (оба дополнительно) файла.
bFileFirst - Это свопы порядка данные, передаваемые функции формате, если это правда (по умолчанию false) первые% S в remoteFormat это имя файла, а второй тег.
bPassTag - Если это правда он добавляет дополнительный параметр в функцию обратного вызова с текущего тега, поэтому вы можете загрузить весь файл из одной функции. Тег название происходит immediatedly до "имя" параметра, так что после любого дополнительного дополнительный параметр:
Нагрузка весь файл сразу:
Code
forward LoadOneFile(tag[], name[], value[]); public LoadOneFile(tag[], name[], value[]) { }
Загрузите файл INI из одного сценария и трансляцию данных по всему серверу. Очень полезно для администратора / пользователя filterscripts чтобы каждый режим для загрузки своих собственных данных.
Code
forward LoadOneUser_LVDM(playerid, name[], value[]); public LoadOneUser_LVDM(playerid, name[], value[]) { }
Отметим, что дополнительный параметр может быть что угодно, а не только PlayerID, а не только Int (хотя она не может быть строка или массив). Это просто происходит, были предназначены для playerids.
Тайминги
Сроки сравнения Дини и SII. Это загрузка 400000 значений из INI-файлы скромные размеры (менее 64 записи (42)). Обратите внимание, что "менее 64" является важным - по умолчанию yini может буфера 64 значений, когда делая вид, что Дини (что является особенностью в моей локальной версии, но еще не выпущен):
Code
dini: 63810 - Yes, that's just over 1 minute yini: 1564 - Yes, that's just over 1 second yini as dini 1: 6009 - Just over 6 seconds yini as dini 2: 91159 - About a minute and a half SII: 52807
Я просто объяснить некоторые результаты. Как я уже говорил в течение года - Дини, в то время популярный, безумно медленно, здесь это почти 45x медленнее, чем yini.
Вопиюще очевидный вывод из этих результатов является использование yini как он был разработан, однако если вы не можете Есть способы, чтобы обойти его.
Два примера yini позирует как Дини являются двумя крайностями. Система yini / Дини считывает файл и буферов. Если файл все еще находится в буфер при следующем запросе из того же файла приходит результат возвращается из памяти, а не от повторного чтения файла в качестве Дини делает.
Первый из этих двух результатов, где вы читали много значений одновременно. В этой версии файл читается один раз и буфером, то все данные получили из буфера. Это, откровенно говоря, наиболее вероятный исход.
Вторая версия, которая на самом деле медленнее, чем Дини, где вы читали несколько значений, то читать другие файлы INI, то читать далее значения. yini может буфера до четырех файлов (по умолчанию) сразу, однако, если вы читали ваши Дини файл, а затем прочитать четырех других файлов, система будет свалка Дини файл, чтобы освободить место в памяти. Дини эмуляции yini занимает немного больше времени, чтобы прочитать файл, чем Дини, но она только читает файл раз в общем, вместо Мени раз - что, где скорость приходит от. В этой версии она имеет дело чуть больше читать и буферизации много раз, худшее из обоих миров.
В общем, если вы используете режим эмуляции Дини вы, вероятно, получить средневзвешенная сильно на минимальное время, особенно если вы не откроете файлы INI и оставить их открытыми:
Code
((6009 * 3) + 91159) / 4 = 27296.5
Таким образом, окончательные результаты:
Code
yini: 1564 dini: 63810 emu : 27297 SII: 52807
Усреднение двумя крайностями режиме эмуляции, предполагая, вы, скорее всего, меньше чем за четыре открытых файлов одновременно, дает более 2х ускорить для yini в режиме эмуляции и оригинальный 45x скорости на регулярные yini.