Не получается загрузить структуру в динамическую память - 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, что означает успешное завершение программы.