# 00057. Работа с INI-файлами ( запись и считывание )

Работа с INI-файлами ( запись и считывание )|В этом укроке мы напишем два скрипта, которые будут использовать ini-файл. Первый будет записывать данные в файл, другой - считывать.|wmysterio|wmysterio||||Очень часто скриптеры хранят какие-то данные в файле. Например: я в моде NFS GTA RACE хранил стартера для миссий, а также текущую модель, уважение в ini-файле.

Рассмотрим основные опкоды. Сначала, обычно, проверяют на существование файла опкодом:

```
0AAB: file_exists "CLEO&#92;temp.ini"
```

Здесь:\
"CLEO\temp.ini" - путь к нужному файлу

Дальше, обычно, если файла не найден, то скриптеры завершают поток, чтобы скрипт без файла не работал. Если файл найден - то можно.

Первый наш скрипт будет записывать данные. Давайте в файле будет хранится состояние жизни и брони CЖ. Другой скрипт будет считывать с того же самого файла данные и выводить их на экран.

Но сначала рассмотрим структуру ini-файла. Обычно он делится на секции - текст, написанный в квадратных скобках:

```
ini
[SECTION]
```

Количество секций неограниченно; а могут и вовсе отсутствовать.

В каждой секции имеются ключевые слова, которым заданы значения типа "int", "float", "string" ( целое, дробное, строка ). Сначала пишем **ключевое слово**, затем символ **=**, а потом **само значение**. Каждое ключевое слово пишется с новой строки.

```
ini
key_int = 25
key_float = -0.23
key_string = WMYSTERIO
```

Сложив всё вместе, мы получим полную структуру ini-файла:

<table><thead><tr><th>Примеры INI-файлов:</th><th></th></tr></thead><tbody><tr><td>Пример 1</td><td>Пример 2</td></tr><tr><td><p>```</p><p>ini [SECTION] key_int = 25 key_float = 1.83 key_string = WMYSTERIO</p><pre><code>&#x3C;/td>&#x3C;td>
</code></pre><p>ini ; Основные данные об актёре [Coord_Actor] position_x = -190.35 position_y = 2004.2345 position_z = 39.0 actor_angle = 180.0</p><p>[Data_Actor] Health = 50 Armor = 100 Name = Smoke</p><pre><code>&#x3C;/td>&#x3C;/tr>
&#x3C;/tbody>&#x3C;/table>

Как и в Санни Билдере, в ini-файлах есть комментарии. Всё что находится после символа **;** будет игнорироваться. Вроде, с этим не должно возникнуть проблем, поэтому рассмотрим опкоды для записи значений в ini-файл:

</code></pre><p>0AF1: write\_int 25 to\_ini\_file "CLEO\temp.ini" section "SECTION" key "key\_int" 0AF3: write\_float 1.85 to\_ini\_file "CLEO\temp.ini" section "SECTION" key "key\_float" 0AF5: write\_string "MY NAME - WMYSTERIO" to\_ini\_file "CLEO\temp.ini" section "SECTION" key "key\_string"</p><pre><code>

\<div class="panel panel-default">
\<div class="panel-body">
Здесь:\<br>
0AF1 - опкод записи целого числа в файл\<br>
0AF3 - опкод записи дробного числа в файл\<br>
0AF5 - опкод записи строки в файл\<br>
"CLEO\&#92;temp.ini" - указывается полный путь к файлу\<br>
"SECTION" - указывается секция, в которую нужно записать данные\<br>
"key\_int", "key\_float", "key\_string" - указываются ключи. Именно в них будут хранится данные
\</div>
\</div>

Теперь считывание с ini-файла:

</code></pre><p>0AF0: 0@ = get\_int\_from\_ini\_file "CLEO\temp.ini" section "SECTION" key "key\_int" 0AF2: 1@ = get\_float\_from\_ini\_file "CLEO\temp.ini" section "SECTION" key "key\_float" 0AF4: 2\@v = read\_string\_from\_ini\_file "CLEO\temp.ini" section "SECTION" key "key\_string"</p><pre><code>

\<div class="panel panel-default">
\<div class="panel-body">
Здесь:\<br>
0AF0 - в переменную считываются целые значения с файла\<br>
0AF2 - в переменную считываются дробные значения с файла\<br>
0AF4 - в переменную считываются строки с файла\<br>
"CLEO\&#92;temp.ini" - указывается полный путь к файлу\<br>
"SECTION" - указывается секция, с которой будет считано значение\<br>
"key\_int", "key\_float", "key\_string" - указываются ключи. Именно из них будут передаваться данные в переменную.
\</div>
\</div>

Для строк всегда возле переменных указывайте префикс **v**. Опкоды рассмотрели, теперь к примерам :) Скрипт, который будет записывать состояние жизни и брони СЖ в ini-файл:

</code></pre><p>{$CLEO} 0000:</p><p>:WRITE thread 'WRITE' wait 0 if 0AAB: file\_exists "CLEO\TEMP.ini" // если файл не найден, то завершаем скрипт jf @WRITE\_END</p><p>:WRITE\_1 wait 0 0@ = actor.Health($PLAYER\_ACTOR) 04DD: 1@ = actor $PLAYER\_ACTOR armour 0AF1: write\_int 0@ to\_ini\_file "CLEO\TEMP.ini" section "CJ" key "Health" // запишем данные в файл 0AF1: write\_int 1@ to\_ini\_file "CLEO\TEMP.ini" section "CJ" key "Armour" jump @WRITE\_1</p><p>:WRITE\_END wait 0 0A93: end\_custom\_thread</p><pre><code>

Скрипт, которые считывает данные из файла и выводит на экран состояние жизни и брони CJ:

</code></pre><p>{$CLEO} 0000:</p><p>:READ thread 'READ' wait 0 if 0AAB: file\_exists "CLEO\TEMP.ini" // Если файл не найден - завершаем скрипт jf @READ\_END</p><p>:READ\_1 wait 0 03F0: enable\_text\_draw 1 // Включаем возможность рисования на экране 0AF0: 0@ = get\_int\_from\_ini\_file "CLEO\TEMP.ini" section "CJ" key "Health" // Считываем данные из файла 0AF0: 1@ = get\_int\_from\_ini\_file "CLEO\TEMP.ini" section "CJ" key "Armour" {-- Выводим данные на экран --} 045A: draw\_text\_1number 20.0 20.0 GXT 'HEA\_1' number 0@ // text: health <del>1</del> 045A: draw\_text\_1number 20.0 30.0 GXT 'BRO\_1' number 1@ // text: armour <del>1</del> jump @READ\_1</p><p>:READ\_END wait 0 0A93: end\_custom\_thread</p><pre><code>

Результат, как всегда, положительный :) Всё работает как часики, и на экран выводится состояние CJ:

\<!--IMG1-->\<img src="/\_pu/0/53472615.png" />\<!--IMG1-->

Интересные факты:

* ini-файл можно редактировать во время игры;
* расширение файла не обязательно должно быть "*.ini", можно и как "*.bag", "\*.fix" и т.п;

На этом урок окончен. Тестируйте ;)|3880|1|0|53472615`png`168`161 </code></pre><p>`||rabota\_s\_ini\_fajlami\_zapis\_i\_schityvanie|1499595834</p></td><td></td></tr></tbody></table>


---

# 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/00057.-rabota-s-ini-failami-zapis-i-schityvanie.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.
