Чтение данных из файла, запись в массив структур - 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;
}
Объяснение кода листинга программы
- Объявлены переменные:
c- массив символов на 20 элементов;name- массив символов на 10 элементов;f- указатель на файл;i- счётчик для цикла;n- счётчик для количества записей в файле;Wthr- массив структур типаWeatherнаnэлементов.
- Пользователю предлагается ввести имя файла, в который необходимо добавить данные.
- Происходит попытка открыть файл. Если файл не найден или не удается открыть, выводится сообщение об ошибке. В противном случае выводится сообщение о успешном открытии файла.
- В цикле, пока не достигнут конец файла, считывается строка из файла с помощью функции
fgets(). - После каждой прочитанной строки увеличивается счётчик
nдля определения количества записей в файле. - Создается массив структур
Weatherнаnэлементов с помощью оператораnew. - Перемещается позиция чтения в файле в конец с помощью функции
fseek(). - Пользователю предлагается ввести дату и температуру.
- Введенные данные записываются в соответствующий элемент массива
Weather. - Записанные данные записываются в файл с помощью функции
fprintf(). - Файл закрывается с помощью функции
fclose(). - Массив
Weatherудаляется с помощью оператораdelete[].