C:
Работа с YAML

Как:

Для работы с YAML в C требуется библиотека, поскольку стандартная библиотека C не предоставляет прямой поддержки для разбора или сериализации YAML. Одной из наиболее популярных библиотек YAML для C является libyaml, которая предлагает как низкоуровневые, так и высокоуровневые интерфейсы для разбора и генерации YAML. Ниже приведен пример того, как разобрать простой YAML-файл, используя libyaml:

Во-первых, вам нужно установить библиотеку libyaml. Если вы используете систему, подобную Unix, обычно ее можно установить через менеджер пакетов. Например, в Ubuntu:

sudo apt-get install libyaml-dev

Затем, рассмотрим простой YAML-файл с именем config.yaml:

name: John Doe
age: 29
married: false

Вот простой пример того, как разобрать этот YAML-файл в C:

#include <yaml.h>
#include <stdio.h>
#include <stdlib.h>

void process_yaml_file(const char *filename) {
    FILE *fh = fopen(filename, "rb");
    yaml_parser_t parser;
    yaml_event_t event;

    if (!yaml_parser_initialize(&parser))
        fputs("Не удалось инициализировать парсер YAML!\n", stderr);

    if (fh == NULL)
        fputs("Не удалось открыть файл!\n", stderr);

    yaml_parser_set_input_file(&parser, fh);

    while (1) {
        if (!yaml_parser_parse(&parser, &event))
            break;

        if (event.type == YAML_SCALAR_EVENT) {
            printf("Значение: %s\n", event.data.scalar.value);
        }

        if (event.type == YAML_STREAM_END_EVENT)
            break;

        yaml_event_delete(&event);
    }

    yaml_parser_delete(&parser);
    fclose(fh);
}

int main() {
    process_yaml_file("config.yaml");
    return 0;
}

Эта простая программа открывает YAML-файл, инициализирует парсер YAML и читает файл, выводя скалярные значения (в данном примере, поля нашего простого YAML). Обратите внимание, что проверка ошибок в этом простом примере минимальна и должна быть более надежной в производственном коде.

Запуск программы с нашим config.yaml выведет:

Значение: John Doe
Значение: 29
Значение: false

Погружение в детали

YAML был впервые выпущен в 2001 году и разработан, чтобы быть более читабельным и удобным для пользователя, чем другие форматы сериализации данных, такие как XML или JSON, заимствуя из нескольких языков, таких как C, Perl и Python, для своей философии дизайна. Несмотря на свои преимущества в читабельности и легкости модификации человеком, YAML может быть сложен для программного разбора из-за своей зависимости от отступов и его обширного набора функций, включая ссылки и настраиваемые типы.

Хотя libyaml предоставляет надежный низкоуровневый доступ к разбору и генерации YAML в C, он может быть громоздким для простых задач из-за его многословного API. По этим причинам некоторые программисты предпочитают использовать более высокоуровневые библиотеки или даже другие форматы сериализации данных, такие как JSON, когда работают на C, особенно когда приоритетом является быстрый разбор с минимальным объемом кода. Тем не менее, YAML остается популярным выбором для файлов конфигурации и ситуаций, когда важна читабельность для человека. Альтернативы, такие как TinyYAML или встраивание высокоуровневого интерпретатора (например, встраивание Python или Lua), могут обеспечить больше удобства для конкретных приложений, балансируя между удобством использования и потребностями в производительности.