Рейтинг - 5.0 (1)

Всем привет! В предыдущем уроке мы говорили о записи файла и считывании из него. Сегодня наш урок посвящен дозаписи. Если открыть файл режимом "wt", то содержимое файла теряется. Если нужно сохранить это содержимое и в свою очередь добавить новую информацию, то нам понадобится режим "at", который и делает дозапись в конец файла.

Давайте напишем скрипт, который будет вести лог. Например, вести мониторинг координат СЖ и его угола каждую секунду и записывать в файл(пока не будет зажата клавиша 1 на 1сек):
Code
:NAME
thread 'NAME'
wait 0
if
file.Open(0@, "Cleo/log.txt", "at")
jf @NAME
wait 2000
0ACE: show_formatted_text_box "FILE IS OPEN"

while 8AB0:  not key_pressed 49 // key 1
    if
    not actor.Dead($PLAYER_ACTOR)
    then
    actor.StorePos($PLAYER_ACTOR, 1@, 2@, 3@)
    4@ = actor.Angle($PLAYER_ACTOR)
    0AD9: write_formatted_text "Pos: %.4f %.4f %.4f angle: %.2f " in_file 0@ 1@ 2@ 3@ 4@
    end
wait 1000
end
file.Close(0@)
0ACE: show_formatted_text_box "FILE IS CLOSED"
0A93: end_custom_thread
Запускаем игру и побродим некоторые время по игровому миру. Проверяем файл и что мы видим? :


Ура! Данные успешно занесены в файл! Но... АААА!!!! Как безобразно всё это выглядит! Неудобство чтения просто зашкаливает! От сюда и возникает вопрос "Как записать данные файла с новой строки в Sanny Builder?". Ответ дал мне пользователь DK22Pac. Как оказалось нужно было добавить в конце строки специальный код, который подразумевает перенос. Следовательно, наш опкод для записы будет выглядеть следующим образом:
Code
0AD9: write_formatted_text "Pos: %.4f %.4f %.4f angle: %.2f%c%c" in_file 0@ 1@ 2@ 3@ 4@ 0xD 0xA
0xD 0xA - это и есть те коды, которые делают переход на новою строку, в конце строки прописываются как идентификатор символа(%c).

Давайте просмотрим на результат этого скрипта:
Code
:NAME
thread 'NAME'
wait 0
if
file.Open(0@, "Cleo/my_text.txt", "at")
jf @NAME
0ACE: show_formatted_text_box "FILE IS OPEN"

while 8AB0:  not key_pressed 49 // key 1
    if
    not actor.Dead($PLAYER_ACTOR)
    then
    actor.StorePos($PLAYER_ACTOR, 1@, 2@, 3@)
    4@ = actor.Angle($PLAYER_ACTOR)
    0AD9: write_formatted_text "Pos: %.4f %.4f %.4f angle: %.2f%c%c" in_file 0@ 1@ 2@ 3@ 4@ 0xD 0xA
    end
wait 1000
end
file.Close(0@)
0ACE: show_formatted_text_box "FILE IS CLOSED"
0A93: end_custom_thread
Давайте посмотрим на результат:


Выглядит куда удобнее )) Этим методом мы можем сделать, например файл с координатами спавна случайных актёров. Давайте переделаем наш скипт:
Code
:NAME
thread 'NAME'
wait 0
if
file.Open(0@, "Cleo/my_text.txt", "rt")
jf @NAME

var
$ACTORS: array 20 of actor
end
$INDEX = 0

while not file.EOF(0@)
    if
    $INDEX > 19
    then
         break
    end // если к-во строк превышает допустимый массив актёров, то выходим с цикла

    if
    0ADA: 7@ = scan_file 0@ format "Pos: %f %f %f angle: %f%c%c" 1@ 2@ 3@ 4@ 5@ 6@ //IF and SET
    then
    0376: $ACTORS[$INDEX] = create_random_actor_at 1@ 2@ 3@
    actor.Angle($ACTORS[$INDEX]) = 4@
    $INDEX += 1
    end
wait 0
end
file.Close(0@)

0A93: end_custom_thread
Если мы допысали код символа, то при считывании мы тоже должны считать его опкодом 0ADA, выделив 2 переменные для записи в них кодов переноса. Результат скрипта:


Создались актёры, в тех местах, где был СЖ при дозаписи файла.

И, напоследок, расскажу вам о текстовых и бинарных файлах (rt - rb, wt - wb, at - ab)
Вообще, разницы между текстовыми файлами и бинарными нет, но при открытии  бинарного файла как текстового могут наблюдаться "косяки". Например, при записи в текстовые файлы все одиночные символы '\r' (символ перевода на новую строку в Mac OS) или '\n' (символ перевода на новую строку в Unix) заменяются на 2 символа "\r\n" (перевод на новую строку в Windows). Поэтому, если работаете с бинарным файлом, открывайте его как бинарный, если с текстовым, открывайте его как текстовый.

Надеюсь эта информация была для Вас полезной smile Немного позже выложу урок, как записать данные в определённое место файла.

NFSCarbon_VSD   (14.11.12 19:45)
При открытии второго спойлера ничего не происходит. Исправьте это, пожалуйста!

wmysterio   (14.11.12 22:58)
Поменял, должна теперь работать

Yurko_UA   (23.02.14 17:22)
"Немного позже выложу урок, как записать данные в определённое место файла."

Напиши будь-ласка. Ця інформація буде дуже корисною!

wmysterio   (23.02.14 18:10)
Уже в процесі. Там не так все просто, як я думав.
Вход на сайт

Поиск
Категории раздела
Мини-чат
Пожалуйста, все вопросы по скриптингу задавать на форуме!
Наш опрос
А вы проходили GTA San Andreas на 100% без читов и скриптов?
Всего ответов: 3
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня нас посетили:
wmysterio
Реклама