Открыто
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>
. Написание собственных "велосипедов" для посимвольного разбора каждой строчки в данном задании не допускается.