Чтение данных из файла, запись в массив структур - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Всем привет, помогите, пожалуйста, с программой. Суть такова: имеется файл вида
слово число ... слово число
нужно записать данный файл в массив структур, как именно это сделать я не понимаю. В данный момент я просто считываю строки из файла, не записывая их в массив:
#include <conio.h>
#include <stdio.h>
#include <windows.h>
 
struct Weather{
    char date[20];// дата
    int temp;// температура
};
 
Weather arr[100]; // Оглашение массива структур
 
void reading()
{
    char c[20];
    char name[10];
    FILE *f;
 
    //SetConsoleCP(1251); 
    //SetConsoleOutputCP(1251); 
 
    printf("Введите имя файла: ");
    gets(name);
 
    f = fopen(name, "r");
    if (f == NULL)
        printf("\nФайл не найден!\n");
    else
        printf("\nФайл открыт успешно!\n\n");
    while (!feof(f))
    {
        fgets(c, 20, f);
        printf("%s", c);
    }
    fclose(f);
}
Так же требуется использовать динамическое выделение памяти, получается, что под массив структур ее выделить нужно?
В задании еще нужно реализовать удаление и добавление записи в массив данных. Я вот не могу понять этот "массив данных" и есть массив структур или его нужно создать?
Так. С записью в массив структур вроде разобрался:
    while (!feof(f))
    {
        fscanf(f, "%s", &arr[i].date);
        fscanf(f, "%d", &arr[i].temp);
        i++;
    }
Сейчас с остальным буду пытаться
Как правильно выделить память под структуру? А то как-то коряво у меня получилось
struct Weather{
    char date[20];// дата
    int temp;// температура
};
 
Weather *Wthr; // Оглашение массива структур
 
void reading()
{
    char c[20], name[10];
    FILE *f;
    int i = 0, number = 0, min = 0, n = 0;

    //SetConsoleCP(1251); 
    //SetConsoleOutputCP(1251); 
 
    printf("Введите имя файла: ");
    gets(name);
 
    f = fopen(name, "r");
    if (f == NULL)
        printf("\nФайл не найден!\n");
    else
        printf("\nФайл открыт успешно!\n\n");
 
    while (!feof(f))
    {
        fgets(c, 20, f);
        n++;
    }
    Wthr = new Weather[n];
 
    while (!feof(f))
    {
        fscanf(f, "%s", &Wthr[i].date);
        fscanf(f, "%d", &Wthr[i].temp);
        i++;
    }
    printf("%d%s", n, Wthr[0].date); //Проверка
    fclose(f);

Решение задачи: «Чтение данных из файла, запись в массив структур»

textual
Листинг программы
void add()
{
    char c[20], name[10];
    FILE *f;
    int i = 0, n = 0;
 
    printf("Введите имя файла, в который хотите добавить запись: ");
    gets(name);
 
    f = fopen(name, "r+");
    if (f == NULL)
        printf("\nФайл не найден!\n");
    else
        printf("\nФайл открыт успешно!\n\n");
    while (!feof(f))
    {
        fgets(c, 20, f);
        n++;
    }
    n++;
    Wthr = new Weather[n];
    fseek(f, 0, SEEK_END);
    printf("Введите дату: ");
    scanf("%s", &Wthr[n].date);
    printf("Введите температуру: ");
    scanf("%d", &Wthr[n].temp);
    fprintf(f, "\n%s %d", Wthr[n].date, Wthr[n].temp);
    fclose(f);
    delete[] Wthr;
}

Объяснение кода листинга программы

  1. Объявлены переменные:
    • c - массив символов на 20 элементов;
    • name - массив символов на 10 элементов;
    • f - указатель на файл;
    • i - счётчик для цикла;
    • n - счётчик для количества записей в файле;
    • Wthr - массив структур типа Weather на n элементов.
  2. Пользователю предлагается ввести имя файла, в который необходимо добавить данные.
  3. Происходит попытка открыть файл. Если файл не найден или не удается открыть, выводится сообщение об ошибке. В противном случае выводится сообщение о успешном открытии файла.
  4. В цикле, пока не достигнут конец файла, считывается строка из файла с помощью функции fgets().
  5. После каждой прочитанной строки увеличивается счётчик n для определения количества записей в файле.
  6. Создается массив структур Weather на n элементов с помощью оператора new.
  7. Перемещается позиция чтения в файле в конец с помощью функции fseek().
  8. Пользователю предлагается ввести дату и температуру.
  9. Введенные данные записываются в соответствующий элемент массива Weather.
  10. Записанные данные записываются в файл с помощью функции fprintf().
  11. Файл закрывается с помощью функции fclose().
  12. Массив Weather удаляется с помощью оператора delete[].

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.8 из 5
Похожие ответы