Блок задач

4. Структуры данных

Темы
Сложность 5

Задача «Чтение конфигурации»

Разработать программу, читающую конфигурацию из текстового файла.

Входные данные

Конфигурационный файл представляет собой текстовый файл, где строки имеют формат ключ значение. И ключ, и значение представляют собой строки:

name foo
value 20

Лишние пробелы игнорируются, также допустимы пустые строки:

     name           foo

value                  20

Допустимы комментарии:

foo 200 # 400
#bar 400

Все символы, начиная с #, считаются пробельными и игнорируются.

Для задания значений с пробелами можно использовать следующую форму:

name " Vasya Pupkin "   # пробелы в начале и конце строки
spaces '     '  # здесь 5 пробелов

Строки, содержащие символы ' и ", могут быть записаны следующим образом:

double_quote   '"'
single_quote "'"
both_quotes "'\""

Обратная косая черта \ играет роль escape-символа (аналогично C) и позволяет задавать следующие спецсимволы (при употреблении внутри закавыченной строки "…" или '…'):

  • \' – одиночная кавычка;
  • \" – двойная кавычка;
  • \n – символ перевода строки (ASCII-код 10);
  • \t – символ табуляции (ASCII-код 9).
  • \\ — сам символ обратной косой черты.

Задача

Реализовать программу которая бы читала конфигурационный файл из входного файла и записывала результат в выходной файл.

Ошибки, связанные с неверным синтаксисом, нужно также выводить в выходной файл, но в самом конце.

Выходные данные

Конфигурация
<ключ> - <значение>
...

Ошибки
<строка с неверным синтаксисом 1>
<строка с неверным синтаксисом 2>
...

Тестирование

Для всех разработанных модулей должны быть созданы наборы unit тестов. Функций ввода/вывода нужно тестировать с помощью std::stringstream.