Задание № 3380

Студент

Кальнеус Екатерина

Задача

Задача на допуск к экзамену

Состояние

Открыто

Назначено

15.06.2021, 03:14

Обновлено

15.06.2021, 04:36

Работаем с текстовым файлом конфигурации Firefox. В каждой строке этого текстового файла содержится запись по типу ключ=значение. Ключ отделяется от значения символом = (знак равно). Ключ составной, части ключа - токены - разделены символом . (точка). Для удобства организации настроек части ключа группируют тематически в древовидную структуру.

Небольшой фрагмент для примера:

services.blocklist.addons.checked=1524227391
services.blocklist.clock_skew_seconds=52
services.blocklist.gfx.checked=1524227391
services.blocklist.last_etag="\"1524147337556\""
services.blocklist.last_update_seconds=1524227391
services.blocklist.onecrl.checked=1524227391
services.blocklist.pinning.checked=1524227391
services.blocklist.plugins.checked=1524227391
services.sync.clients.lastSync="0"
services.sync.clients.lastSyncLocal="0"
services.sync.declinedEngines=""
services.sync.globalScore=0
services.sync.migrated=true
services.sync.nextSync=0
services.sync.tabs.lastSync="0"
services.sync.tabs.lastSyncLocal="0"

Необходимо визуализировать группировку частей ключа в древовидную структуру в следующем формате:

[services]
    [blocklist]
        [addons]
            checked=1524227391
        [gfx]
            checked=1524227391
        [onecrl]
            checked=1524227391
        [pinning]
            checked=1524227391
        [plugins]
            checked=1524227391
        clock_skew_seconds=52
        last_etag="\"1524147337556\""
        last_update_seconds=1524227391
    [sync]
        [clients]
            lastSync="0"
            lastSyncLocal="0"
        [tabs]
            lastSync="0"
            lastSyncLocal="0"
        declinedEngines=""
        globalScore=0
        migrated=true
        nextSync=0

Правила форматирования:

  1. Для отображения глубины вложенности токена ключа используется символ табуляции (\t).

  2. Значение ключа выводится в том-же виде, в каком оно дано в исходном конфигурационном файле.

  3. Значение ключа отделяется от крайнего - терминального - токена знаком равно без пробелов (токен=значение).

  4. Если токен ключа не является терминальным - имя токена заключается в квадратные скобки ([токен]).

Входные данные : файл конфигурации.

Выходные данные: текстовый файл с древовидным представлением конфигурации в заданном формате.

Требования:

  1. Необходимо написать класс, хранящий в себе древовидную структуру. Допускается использование контейнеров из стандартной библиотеки. В силу ограничений времени допускается некоторая неоптимальность решения с точки зрения производительности. Не допускаются решения приводящие к утечкам памяти.

  2. Класс должен принимать весь исходный файл, а выводить только запрошенный фрагмент дерева.

  3. Класс должен уметь принимать исходные конфигурационные данные и сохранять результат как в текстовый файл, так и в консоль, и в строковый буфер в памяти. Требуется работа с std::istreamstd::ostream и их наследниками. Не допускается написание множества однотипных методов для каждого случая.

  4. Требуется вести разбор текста готовыми средствами класса std::string (findfind_first_offind_first_offind_first_not_ofsubstr и т.п.), или же с помощью обобщённых алгоритмов из модуля <algorithm>. Написание собственных "велосипедов" для посимвольного разбора каждой строчки в данном задании не допускается.

Действия