Загрузка данных


# Лабораторная работа 1

### Шаблонизатор

## Задача

Реализовать [утилиту](https://ru.wikipedia.org/wiki/%D0%A3%D1%82%D0%B8%D0%BB%D0%B8%D1%82%D0%B0), производящую на основе шаблона и простого языка разметки генерацию текстового документа.


На вход программа получает два текстовых файла:


1. __*Шаблон*__ — текстовый файл, содержащий специальные *placeholders*, которые обозначают места для подстановки значений. В данной работе метки будут заключаться в двойные фигурные скобки: `{{ variable_name }}`.
2. __*Данные*__ — файл в формате "ключ=значение", где каждое определение переменной находится на новой строке.

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


### Файл с данными

* Формат файла: каждая строка содержит одну переменную в виде KEY=VALUE.
* Пробелы вокруг знака __=__ и в начале/конце строки должны игнорироваться. Строки, начинающиеся с __#__ или __//__, считаются комментариями и пропускаются.
* Допустимые символы в ключе и значении: латиница, цифры, подчёркивания.
* Ключ и значение представляют из себя только одно слово (многословные ключи и многословные значения исключены)
* Длина ключа и значения не превышает 100 символов.
* Количество пар ключей не превышает 1024.
* При повторном определении ключа последнее определение заменяет предыдущее.




### Файл с шаблоном

* В тексте расположены специальные метки вида `{{ variable_name }}`.
* Пробелы внутри скобок по краям имени допустимы и игнорируются.
* `variable_name` является ключом из файла с данными.
* При генерации все ключи должны быть заменены на соответсвующие значения.


### Аргументы программы

Утилита должна поддерживать следующие аргументы командной строки (опции):

| Короткий аргумент | Длинный аргумент       | Обязательный агрумент   | Описание |
|-------------------|--------------------------|:-------------------------:|----------|
| `-t path`         | `--template=path`        |           ✅             | Путь к файлу-шаблону     |
| `-d path`         | `--data=path`            |           ✅             | Путь к файлу c данными   |
| `-o path`         | `--output=path`          |          ❌              | Путь к итоговому файлу (если не указан, то вывод в стандартный поток вывода) |


Все файлы в текстовом формате.

```
generator --template=template.txt --data=data.dat --output=output.txt
```


### Коды возврата


- 0 — успешное завершение
- 1 — в шаблоне есть метка без соответствующего ключа в данных.
- 2 — ошибка в аргументах командной строки (отсутствуют обязательные параметры, неверный формат опций).
- 3 — ошибка ввода-вывода (не удалось открыть/прочитать/записать файл).
- 4 — синтаксическая ошибка в шаблоне (незакрытая метка, некорректные фигурные скобки).
- 5 — все остальные случаи, которые являются ошибочными.


## Ограничения


В данной лабораторной работе запрещается:
- Использовать библиотеки кроме стандартной библиотеки языка C++
- Использовать [std::string](https://en.cppreference.com/w/cpp/string.html)
- Использовать [контейнеры стандартой библиотеки](https://en.cppreference.com/w/cpp/container.html)
- Использовать регулярные выражения из [std::regex](https://en.cppreference.com/w/cpp/regex.html)



## NB

Для реализации утилиты потребуется воспользоваться [стандартной библиотекой ввода/вывода](https://en.cppreference.com/w/cpp/io/basic_ifstream). [Пример использования](https://cplusplus.com/doc/tutorial/files/).

С примером того, как можно организовать парсинг аргументов командной строки, можно ознакомиться [здесь](http://www.cplusplus.com/articles/DEN36Up4/).


## Пример

  Пример входных данных и результата можно найти в [example](example)


## ТеорМин

    1. Стандартные типы данных
    2. Представление чисел в памяти
    3. Литералы
    4. Указатели
    5. Массивы
    6. Арифметика указателей
    7. Строки
    8. Указатели на функцию


## Deadline

| deadline | date | coeff | branch |
|----------|-----------------|-------|------------|
| 0 | 06.10.25 23:59 | 1.0 | deadline_0 |
| 1 | 13.10.25 23:59 | 0.8 | deadline_1 |
| 2 | 20.10.25 23:59 | 0.65 | deadline_2 |
| 3 | 21.10.25 00:00 | 0.5 | deadline_3 |

Максимальное количество баллов - 12