```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef struct {
    int number;
    char *word;
} DataItem;

typedef struct {
    DataItem *items;
    size_t size;
    size_t capacity;
} DataList;

int trim(char **str) {
    char *start = *str;
    while (isspace((unsigned char)*start)) start++;
    if (*start == '\0') {
        *str = start;
        return 0;
    }
    char *end = start + strlen(start) - 1;
    while (end > start && isspace((unsigned char)*end)) end--;
    *(end + 1) = '\0';
    *str = start;
    return 1;
}

int init_data_list(DataList *list, size_t initial_capacity) {
    list->items = malloc(initial_capacity * sizeof(DataItem));
    if (!list->items) return 0;
    list->size = 0;
    list->capacity = initial_capacity;
    return 1;
}

int append_data_list(DataList *list, int number, const char *word) {
    if (list->size >= list->capacity) {
        size_t new_capacity = list->capacity * 2;
        DataItem *temp = realloc(list->items, new_capacity * sizeof(DataItem));
        if (!temp) return 0;
        list->items = temp;
        list->capacity = new_capacity;
    }
    list->items[list->size].number = number;
    list->items[list->size].word = strdup(word);
    if (!list->items[list->size].word) return 0;
    list->size++;
    return 1;
}

void free_data_list(DataList *list) {
    for (size_t i = 0; i < list->size; i++) {
        free(list->items[i].word);
    }
    free(list->items);
}

int main(void) {
    const char *file_path = "data.txt";
    FILE *file = fopen(file_path, "r");
    if (!file) {
        fprintf(stderr, "Ошибка при открытии файла: %s\n", file_path);
        return EXIT_FAILURE;
    }

    DataList list;
    if (!init_data_list(&list, 16)) {
        fprintf(stderr, "Ошибка выделения памяти.\n");
        fclose(file);
        return EXIT_FAILURE;
    }

    char *line = NULL;
    size_t len = 0;
    ssize_t read;

    while ((read = getline(&line, &len, file)) != -1) {
        if (read <= 1) continue;

        char *newline = strchr(line, '\n');
        if (newline) *newline = '\0';

        char *comma = strchr(line, ',');
        if (!comma) {
            fprintf(stderr, "Неверный формат строки: '%s'\n", line);
            continue;
        }

        *comma = '\0';
        char *number_str = line;
        char *word = comma + 1;

        if (!trim(&number_str) || !trim(&word)) {
            fprintf(stderr, "Неверный формат строки: '%s,%s'\n", number_str, word);
            continue;
        }

        char *endptr;
        long number = strtol(number_str, &endptr, 10);
        if (*endptr != '\0') {
            fprintf(stderr, "Неверное число в строке: '%s'\n", line);
            continue;
        }

        if (!append_data_list(&list, (int)number, word)) {
            fprintf(stderr, "Ошибка обработки данных.\n");
            free(line);
            free_data_list(&list);
            fclose(file);
            return EXIT_FAILURE;
        }
    }

    free(line);
    fclose(file);

    printf("Список объектов DataItem:\n");
    for (size_t i = 0; i < list.size; i++) {
        printf("DataItem(number=%d, word=%s)\n", list.items[i].number, list.items[i].word);
    }

    free_data_list(&list);
    return EXIT_SUCCESS;
}
```
Хороша ли эта прграмма? Соответствует ли она тому что называют хорошим кодом?