°•°•° Проект SAMP - Romashka [0.3e] ™18+™ °•°•° :: Теория :: Pawn :: Основы скриптинга
Использование split
Допустим, нам нужно сохранить транспорт в файл.
Научимся считывать данные с файла в строках, где указано не 1, а несколько параметров сразу разделенных запятой или другим знаком.
Функция split как раз и отделяет эти параметры.
Первый аргумент функции, это строка с параметрами, параметры которой нужно разделить.
Второй аргумент функции это двумерный массив, куда нужно поместить извлеченные параметры.
Третий аргумент функции, это строка с символом, который разделяет эти параметры. Если указать
неправильный символ, функция не сработает.
Для начала в любом месте скрипта пишем эту функцию:
stock split(const strsrc[ ], strdest[ ][ ], delimiter)
{
new i, li;
new aNum;
new len;
while(i <= strlen(strsrc)){
if(strsrc[i]==delimiter || i==strlen(strsrc)){
len = strmid(strdest[aNum], strsrc, li, i, 128);
strdest[aNum][len] = 0;
li = i+1;
aNum++;
}
i++;
}
return 1;
}
Теперь объявим массив enum и глобальную переменную:
enum zInfo
{
Float:zX,
Float:zY,
Float:zZ,
};
new CarInfo[3][zInfo];
Массив zInfo будет хранить считанные с файла данные.
Внутри массива мы объявляем переменные для хранения координат X,Y,Z (zX, zY, zZ).
Сразу обратите внимание.
Чтобы обратиться к переменной из массива zInfo, чтобы передать ее значение другой переменной, нам нужно использовать массив CarInfo.
Первая цифра в квадратных скобках, это количество строк в массиве, во вторых квадратных скобках будет имя ячейке, к которой мы обращаемся, например: zX. То есть обращение к ячейке массива будет выглядеть так: CarInfo[5][zX] (мы обращаемся к 5 строке массива, к ячейке zX.
Саму загрузку данных из файла нужно делать в отдельном public, как показано на примере ниже.
stock LoadCars()
{
new arrCoords[3][64];
new strFromFile2[256];
new File: file = fopen("cars.cfg", io_read);
if (file)
{
new idx;
while (idx < sizeof(CarInfo))
{
fread(file, strFromFile2);
split(strFromFile2, arrCoords, '|');
CarInfo [idx][ zX] = floatstr(arrCoords[0]);
CarInfo [idx][ zY] = floatstr(arrCoords[1]);
CarInfo [idx][ zZ] = floatstr(arrCoords[2]);
idx++;
}
fclose(file);
}
return 1;
}
Idx – это номер строки.
С помощью цикла while мы поочередно считывает с каждой строки файла координаты.
Процесс считывания:
Создаем новый массив для временного хранения загруженных данных: arrCords
Первая цифра в квадратных скобках должна соответствовать цифре массива CarInfo.
Создаем переменную strFromFile2, куда будет извлекаться полученная из файла строка с параметрами.
Дальше мы открываем файл cars.cfg, он должен обязательно существовать в директории scriptfiles, иначе возможен крах сервера (строка 5).
После проверки создается переменная для хранения номеров строк (строка 8).
После переменной идет цикл while (строки 9-17). В цикле первым делом мы считываем первую строку файла и записываем в переменную: strFromFile2 (строка 11).
Параметры в файле должны быть разделены знаком, | так как показано в скрипте между одинарных кавычек, а иначе данные будут считаны неправильно.
Функцией split отделяем параметры от строки и записываем в массив arrCords по разным ячейкам (строка 12).
Дальше копируем считанные данные в массив CarInfo, перед этим обязательно с помощью функции floatstr, мы преобразуем строку, которую мы получили в вещественное число, так как координаты это вещественные числа, а не строки (строки 13-15) и мы их передаем в переменные вещественного типа.
В конце массива мы переходим на новую строку и повторяем наш цикл до тех пор, пока цикл не считает 3 строки массива.