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