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

В предыдущем уроке мы говорили о записи файла и него чтение. Сегодня наш урок посвящен дозаписи.

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

Давайте напишем скрипт, который будет вести лог. Например, вести мониторинг координат СЖ и его угола каждую секунду и записывать в файл ( пока не будет зажата клавиша 1 ):

: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

Запускаем игру и побродим некоторые время по игровому миру. Проверяем файл и что мы видим? :

Ура! Данные успешно занесены в файл! Но... АААА!!!! Как безобразно всё это выглядит! Неудобство чтения просто зашкаливает! От сюда и возникает вопрос "Как записать данные файла с новой строки?". Ответ дал мне пользователь DK22Pac. Как оказалось нужно было добавить в конце строки специальные коды, который подразумевает перенос строки ( символы окончания и переноса строки ). Следовательно, наш опкод для записы будет выглядеть следующим образом:

0AD9: write_formatted_text "Pos: %.4f %.4f %.4f angle: %.2f%c%c" in_file 0@ 1@ 2@ 3@ 4@ 0xD 0xA

0xD 0xA - это и есть те коды, которые делают переход на новою строку, в конце строки прописываются как идентификатор символа ( %c). Давайте обновим наш скрипт:

: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

Давайте посмотрим на результат:

Выглядит куда удобнее! Этим методом мы можем сделать, например файл с координатами спавна случайных актёров. Давайте переделаем наш скипт:

: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 ). Поэтому, если работаете с бинарным файлом, открывайте его как бинарный, если с текстовым - открывайте его как текстовый.

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


Теги: File, Дозапись файла, Файл

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)
Уже в процесі. Там не так все просто, як я думав.
Вход на сайт

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

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

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