# 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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lessons.sannybuilder.com/00100/00200/00093.-rabota-s-failami-dozapis.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
