> For the complete documentation index, see [llms.txt](https://lessons.sannybuilder.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lessons.sannybuilder.com/00100/00200/00093.-rabota-s-failami-dozapis.md).

# 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
```

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

![](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/1/83210492.png)

Ура! Данные успешно занесены в файл! Но... АААА!!!! Как безобразно всё это выглядит! Неудобство чтения просто зашкаливает! От сюда и возникает вопрос "Как записать данные файла с новой строки?". Ответ дал мне пользователь **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
```

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

![](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/1/00269069.png)

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

```
: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 переменные для записи в них кодов переноса. Результат скрипта:

![](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/1/60046112.png)

Создались актёры, в тех местах, где был СЖ при дозаписи файла. И, напоследок, расскажу вам о текстовых и бинарных файлах ( r**t** - r**b**, w**t** - w**b**, a**t** - a**b** ). Вообще, принципиальной разницы между текстовыми файлами и бинарными нет, но открытие бинарного файла как текстового могут наблюдаться "косяки". Например, при записи в текстовые файлы все одиночные символы "\r" ( символ перевода на новую строку в Mac OS ) или "\n" ( символ перевода на новую строку в Unix ) заменяются на 2 символа "\r\n" ( перевод на новую строку в Windows ). Поэтому, если работаете с бинарным файлом, открывайте его как бинарный, если с текстовым - открывайте его как текстовый.

Надеюсь, эта информация была для Вас полезной :) Немного позже выложу урок, как записать данные в определённое место файла.|1511|1|0|00269069`png`440`330`399`300``\|60046112`png`500`300`400`240``\|83210492`png`769`117`400`60``||rabota\_s\_fajlami\_dozapis|1504427021
