Чтение данных из файла, запись в массив структур - 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[]
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д