Загрузка данных
# Лабораторная работа 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