§ 9. Форматированный и двоичный ввод/вывод

Задания

  1. Напишите программу, которая читает конфигурационный файл и записывает считанные ключи и значения в таблицу. Файл имеет формат «ключ=значение»:
    x=10
    y =5
    
    z = 6
    
       q    =      abc
    Ключу и значению может предшествовать любое количество пробелов. За ключом и значением может следовать любое количество пробелов. Предшествующие и следующие пробелы не являются частью ключа и значения. Пробелы определяются с помощью функции std::isspace. Ключ и значение должны находится на одной строке. Таблица хранится в классе std::unordered_map<std::string,std::string>.
  2. Напишите модульные тесты для проверки корректности работы программы. Для этого воспользутесь классом std::stringstream для создания потока из строки символов.
  3. Создайте класс ln80c_buffer как подкласс std::streambuf, который ограничивает длину строки 72-мя символами и нумерует строки в порядке их вывода в поток. Для простоты предположите, что символ перевода строки '\n' не будет выводится в этот буфер.
    • Для записи номера строки используются первые 8 символов и функцию std::sprintf.
    • Ваш класс должен использовать массив char line[81] в качестве буфера (длину массива можно выбрать другую).
    • Ваш класс является фильтром, то есть запись символов в файл или в строку осуществляет через стандартный буфер std::stringbuf или std::filebuf, указатель на который передается в ваш класс.
    • Для проверки напишите модульный тест, в котором ваш класс используется в качестве буфера для std::ostream.
    Код out << "1234567890" должен вывести строки
    12345
    67890
    при условии, что ограничение не 72, а 10 символов.
  4. Напишите программу, которая записывает в файл массив (std::vector) из следующих структур.
    struct Kernel {
        int32_t id;
        int32_t parent_id;
        int32_t target_id;
        std::string name;
        uint64_t payload_size;
        std::unique_ptr<char[]> payload;
    };
    
    Запись ведется в двоичном виде, порядок байт — big-endian. Затем считайте из файла массив и проверьте, что он правильно считался. Программа должна быть написана в виде модульного теста.