Kategorien
C++

CSV Datei einlesen in Struct

Einlesen einer CSV Datei am Bsp. der magicNumbers.txt. Akademisch schlecht an dem Beispiel ist, das die beiden structs mit festem Längen ausgestattet sind. Der Speicher müsste dynamisch erzeugt werden mit realloc wie bei  der 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;
}