CSV file import in Struct


Reading a CSV file on the Ex. der magicNumbers.txt. Academically bad is the example, that the two structs are equipped with fixed lengths. The memory should be created dynamically with realloc as the variable magicNumbers.

magicNumbers.txt:
Adobe PDF;pdf;0x255044462d;evince %1
Postscript;ps;0x2521;evince %1
jpg, jpeg;jpg;0xffd8ffe0;gimp %1
header.h:

struct MagicNumbers
{
    char dateitTyp[20];
    char defaultExtension[4];
    char magicNumber[30];    
    char codeConsole[40];
};
struct MagicNumbersTableArray
{
    MagicNumbers magicNumbers[8];
};
MagicNumbersTableArray* readMagicNumbersFromFile(void);
file.cpp:

struct MagicNumbersTableArray* readMagicNumbersFromFile(void)
{

        char fileName[50] = MAGIC_FILE_NAME;

        FILE *file = NULL;
        struct MagicNumbers *magicNumbers = NULL;
        int x = 1;
        int i;

        file = fopen (fileName, "r");

        if (file == NULL)
        {
                cout << "Fehler beim Oeffnen von Datei: " << fileName << endl;
        }

        char line [500];
        fgets (line, sizeof(line) ,file );

        while(1)
        {

                magicNumbers = (struct MagicNumbers*) realloc(magicNumbers, x * sizeof(struct MagicNumbers));

                if(magicNumbers == NULL)
                {
                        cout << "Es konnte kein Speicher angelegt werden." << fileName << endl;
                }
                if(
                   fscanf(
                          file, "%[^;];%[^;];%[^;];%[^\n]\n", 
                          magicNumbers[x - 1].dateitTyp, 
                          magicNumbers[x - 1].defaultExtension, 
                          magicNumbers[x - 1].magicNumber, 
                          &magicNumbers[x - 1].codeConsole
                          ) == EOF)
                {
                        break;
                }
                x++;
        }
        struct MagicNumbersTableArray* magicNumbersTableArray = new MagicNumbersTableArray;
        for(i = 0; i < x - 1; i++)
        {
                printf("%s ,%s ,%s ,%s \n", 
                       magicNumbers[i].dateitTyp, 
                       magicNumbers[i].defaultExtension, 
                       magicNumbers[i].magicNumber, 
                       magicNumbers[i].codeConsole
                       );
                magicNumbersTableArray->magicNumbers[i] = magicNumbers[i];
        }
        free(magicNumbers);    
return magicNumbersTableArray;
}