Открыто
15.06.2021, 03:14
15.06.2021, 04:17
Работаем с текстовым файлом конфигурации 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
Правила форматирования:
Для отображения глубины вложенности токена ключа используется символ табуляции (\t).
Значение ключа выводится в том-же виде, в каком оно дано в исходном конфигурационном файле.
Значение ключа отделяется от крайнего - терминального - токена знаком равно без пробелов (токен=значение).
Если токен ключа не является терминальным - имя токена заключается в квадратные скобки ([токен]).
Входные данные : файл конфигурации.
Выходные данные: текстовый файл с древовидным представлением конфигурации в заданном формате.
Требования:
Необходимо написать класс, хранящий в себе древовидную структуру. Допускается использование контейнеров из стандартной библиотеки. В силу ограничений времени допускается некоторая неоптимальность решения с точки зрения производительности. Не допускаются решения приводящие к утечкам памяти.
Класс должен принимать весь исходный файл, а выводить только запрошенный фрагмент дерева.
Класс должен уметь принимать исходные конфигурационные данные и сохранять результат как в текстовый файл, так и в консоль, и в строковый буфер в памяти. Требуется работа с std::istream, std::ostream и их наследниками. Не допускается написание множества однотипных методов для каждого случая.
Требуется вести разбор текста готовыми средствами класса std::string (find, find_first_of, find_first_of, find_first_not_of, substr и т.п.), или же с помощью обобщённых алгоритмов из модуля <algorithm>. Написание собственных "велосипедов" для посимвольного разбора каждой строчки в данном задании не допускается.