Не получается загрузить структуру в динамическую память - C (СИ)
Формулировка задачи:
Есть массив структур треугольников, нужно прочесть из файла длину 3-х сторон каждого треугольника. Допустим есть txt файл, в нем записано "1 1 1 2 2 2" грубо говоря функция должна прочесть из файла 2 треугольника, 1 со сторонами 1 1 1 и 2 со сторонами 2 2 2. Перепробовал уже как угодно...Подскажите что-нибудь
int load (Triangle **z) { FILE *f; int n; char FileName[15]; printf( "Enter the name of file: \n" ); scanf( "%s",FileName ); strcat(FileName,".txt"); if ((f=fopen(FileName, "r")) != NULL) { n=0; *z= ( Triangle*)malloc(sizeof( Triangle)); fscanf (f,"%lg %lg %lg",&(*z)[0].n,&(*z)[0].m,&(*z)[0].o); while (!feof(f)) { n++; *z = realloc(*z, (n+1) * sizeof(Triangle)); fscanf (f,"%lg %lg %lg",&(*z)[n].n,&(*z)[n].m,&(*z)[n].o); } fclose(f); printf("Load successful.\n"); } return n; }
Решение задачи: «Не получается загрузить структуру в динамическую память»
textual
Листинг программы
typedef struct { float a, b, c; } Triangle; #include <stdio.h> int load(Triangle *triangle, size_t *count) { FILE *f = fopen("<pathToFile>", "r"); if (f != NULL) { for(int i = 0; !feof(f); i++) { if(fscanf("%f %f %f", &triangle[i].a, &triangle[i].b, &triangle[i].c) == 3) *count++; } fclose(f); printf("Load successful.\n"); return 1; } return 0; } int main(void) { system("chcp 1251"); int n = 0, count = 0; scanf("%d", &n); Triangle *triangle = malloc(sizeof(Triangle) * n); if (load(triangle, count)) { //делаем что-то } return 0; }
Объяснение кода листинга программы
- В начале кода объявляется структура
Triangle
, которая содержит три поля типаfloat
-a
,b
иc
. - Затем подключается стандартная библиотека
stdio.h
, которая содержит функции для ввода и вывода данных. - Определяется функция
load
, которая принимает указатель на массив структурTriangle
и указатель на переменнуюcount
, которая отслеживает количество успешно загруженных структур. - Внутри функции
load
открывается файл для чтения с помощью функцииfopen
. - Если файл успешно открыт, то в цикле
for
происходит чтение данных из файла с помощью функцииfscanf
. fscanf
считывает три значения типаfloat
и сохраняет их в соответствующие поля структурыTriangle
.- Если чтение данных прошло успешно (то есть
fscanf
вернул значение 3), то переменнаяcount
увеличивается на 1. - После окончания цикла
for
файл закрывается с помощью функцииfclose
. - Если файл был успешно открыт и закрыт, и все данные были успешно считаны, то функция возвращает 1. В противном случае возвращается 0.
- В функции
main
сначала выполняется командаchcp 1251
, которая задает кодировку консоли как 1251 (Windows Cyrillic). - Затем пользователю предлагается ввести число
n
, которое определяет количество структурTriangle
, которые нужно загрузить. - После ввода числа
n
выделяется память под массив структурTriangle
с помощью функцииmalloc
. - Если выделение памяти прошло успешно, то вызывается функция
load
с передачей указателя на массив структурTriangle
и указателя на переменнуюcount
. - Если функция
load
вернула значение 1, то можно выполнять какие-то действия с загруженными данными. - В конце функции
main
возвращается 0, что означает успешное завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д