00093. Работа с файлами ( Дозапись )

Работа с файлами ( Дозапись )|В предыдущем уроке мы говорили о записи файла и него чтение. Сегодня наш урок посвящен дозаписи.|wmysterio|wmysterio||||Всем привет! Если открыть файл режимом "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 ). Поэтому, если работаете с бинарным файлом, открывайте его как бинарный, если с текстовым - открывайте его как текстовый.

Надеюсь, эта информация была для Вас полезной :) Немного позже выложу урок, как записать данные в определённое место файла.|1511|1|0|00269069png440330399300``\|60046112png500300400240\|83210492`png`769`117`400`60||rabota_s_fajlami_dozapis|1504427021

Last updated