Как присвоить значение массиву структур в C? - PullRequest
1 голос
/ 17 апреля 2020

Существует функция load, которая считывает массив структур из двоичного файла и возвращает этот массив. Это работает правильно. Но проблема в том, что я не могу присвоить массиву структур значение, которое возвращает функция load.

struct tickets
{
    char plane [7];
    char zona [13];
    int rate;
    int cost;

};

struct tickets* load(char * filename)
{
    FILE * file;
    char *symbol;
    int m = sizeof(int);
    int n, i;
    int *pti = (int *)malloc(m);

    if ((file = fopen(filename, "r")) == NULL)
    {
        perror("Error occured while opening file");

    }
    symbol = (char *)pti;
    while (m>0)
    {
        i = getc(file);
        if (i == EOF) break;
        *symbol = i;
        symbol++;
        m--;
    }
    n = *pti;
    struct tickets* ptr = (struct tickets *) malloc(n * sizeof(struct tickets));
    symbol = (char *)ptr;
    while ((i= getc(file))!=EOF)
    {
        *symbol = i;
        symbol++;
    }

    fclose(file);
    return  ptr;
}
int main(void)
{
    char * filename = "p.dat";
    struct tickets* ticket = NULL;
    ticket = load(filename);
}

1 Ответ

0 голосов
/ 18 апреля 2020

следующий предложенный код:

  1. безупречная компиляция
  2. выполняет желаемую функциональность
  3. правильно проверяет ошибки
  4. сообщает main() функция о том, сколько экземпляров struct tickets было прочитано
  5. информирует пользователя при возникновении любой ошибки
  6. убирает за собой
  7. устраняет один из вызовов malloc()
  8. использует функцию: fread(), чтобы избежать проблем с little/big Endian
  9. документами, почему каждый заголовочный файл включен
  10. предполагает количество заявок (первые 4 байта файла) в двоичном формате
  11. содержит соответствующие горизонтальные и вертикальные интервалы для удобства чтения

предостережение: поскольку ни один пример входного файла не опубликован, этот код не тестируется

, и теперь предлагаемый код:

#include <stdio.h>    // perror(), NULL, FILE*, EOF, 
                      // fopen(), fclose(), fread()
#include <stdlib.h>   // malloc(), free(), exit(), EXIT_FAILURE

#define MAX_PLANE_LEN 7
#define MAX_ZONA_LEN  13
#define COUNT_LEN 4

struct tickets
{
    char plane [ MAX_PLANE_LEN ];
    char zona [ MAX_ZONA_LEN ];
    int rate;
    int cost;
};


struct tickets* load( char * filename, size_t * ticketCount )
{
    FILE * fp;
    if ( ! (fp = fopen( filename, "r" )) )
    {
        perror( "Error occured while opening file" );
        exit( EXIT_FAILURE );
    }

    size_t bytesRead = fread( ticketCount, 1, COUNT_LEN, fp );      
    if( bytesRead != COUNT_LEN )
    {
        fprintf( stderr, "failed to read count of number of instances of 'struct tickets'\n" );
        fclose( fp );
        exit( EXIT_FAILURE );
    }

    struct tickets* ptr =  malloc( *ticketCount * sizeof( struct tickets ) );
    if( ! ptr )
    {
        perror( "malloc failed" );
        fclose( fp );
        exit( EXIT_FAILURE );
    }

    for( size_t i = 0; i < *ticketCount; i++ )
    {
        size_t numBytes = fread( &(ptr[i]), 1, sizeof( struct tickets ), fp );
        if( numBytes != sizeof( struct tickets ) )
        {
            perror( "read of a struct ticket failed" );
            fclose( fp );
            free( ptr );
            exit( EXIT_FAILURE );
        }
    }

    fclose( fp );
    return  ptr;
}


int main( void )
{
    char * filename = "p.dat";
    size_t ticketCount = 0;
    struct tickets* ticket = load( filename, &ticketCount );
    // ...
    free( ticket );
}
...