как создать массив c динамических структур в C - PullRequest
0 голосов
/ 12 апреля 2020

Я читаю данные из файла и мне нужен динамический c массив структур, основанный на том, сколько строк читается из файла.

Файл, который я читаю, может иметь до 5000 строк, теоретически я мог бы просто создать массив размером 5000, но я вижу, что неэффективно, поскольку некоторые файлы могут иметь только 10 строк

Указатели довольно новы для меня, но я не отступаю от них, Я также никогда не использовал Mallo c или бесплатно. Вот что я придумал, хотя 9/10 раз я получаю ошибку отладочного утверждения.

моя структура, которая содержит все необходимые элементы данных

struct RiderInfo
{
    char name[41];
    int age;
    char raceLength[2];
    double startTime;
    double mountainTime;
    double finishTime;
    int withdrawn;
};
//Allocate space for next element
void allocateParticipant(struct RiderInfo participantList[])
{
    participantList = realloc(participantList, sizeof(struct RiderInfo));
}

//read file
int readData(struct RiderInfo participantList[], const char filepath[])
{

    //Declare Variables
    int ammount = 0, rValue = 0;

    //Declare filepointer
    FILE* fp = fopen(filepath, "r");

    //Continue to loop while return of readfile is correct
    while (rValue == 0)
    {
        allocateParticipant(participantList);
        //Read one line file, rValue is the return (if return of 1 eof reached)
        rValue = readFileRecord(fp, &participantList[ammount]);
        ammount++;
    }

    return ammount;

}

//free memory
void freeMemory(struct RiderInfo participantList[])
{
    free(participantList);
}

int main(void)
{

    //Declare struct array to hold each participants values
    struct RiderInfo participant[] = { 0 };

    //Declare filename for data
    const char datafile[] = "data.txt";

    //Read data from file and save return in size
    int size = readData(&participant, datafile);

    //Output Data
    for (i = 0; i < size; i++)
    {
        printParticipant(&participant[i], 0);
    }

    //Free all used memory before exit
    freeMemory(&participant);

    //Exit
    return 0;

...