CSV Datei einlesen und in Struct schreiben



  • Hallo zusammen,

    Ich habe hier im Forum folgenden Code gefunden: http://www.c-plusplus.net/forum/214599

    Den habe ich nun für meine Bedürfnisse abgewandelt und nun bekomme ich folgenden Fehler und seh leider nicht was hier jetzt falsch ist:

    Fehler:

    Zeile 46: warnung: format '%[^
    ' expects type 'char *', but argument 12 has type 'int *'
    

    Der Zeilenumbruch ist so gewollt ( ich denke wegen dem \n )
    Ich weiß jetzt nicht warum er ein char erwartet...

    Mein Code:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct Daten
    {
      char frage[200];
      char richtigeAntwort[40];
      char antwort2[40];
      char antwort3[40];
      char antwort4[40];
      char vorkommentar[200];
      char nachkommentar[200];
      char bildurl[40];
      char thema[40];
      int schwierigkeit;
    };
    
    int main(int argc, char* argv[])
    {
    	FILE *fz = NULL;
    	struct Daten *daten = NULL;
    	int x = 1;
    	int i;
    
    	fz = fopen ("quiz-fragen-test.csv", "r");
    
    	if (fz == NULL)
    	{
    		printf ("Fehler beim Oeffnen von %s\n", argv[1]);
    		fflush(stdin);
    		getchar();
    		return 1;
    	}
    
    	while(1)
    	{
    		daten = realloc(daten, x * sizeof(struct Daten));
    		if (daten == NULL)
    		{
    			printf("Es konnte kein Speicher angelegt werden.\n");
    			fflush(stdin);
    			getchar();
    			return 1;
    		}
    		if(fscanf(fz, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^\n]\n", daten[x-1].frage, daten[x-1].richtigeAntwort, daten[x-1].antwort2, daten[x-1].antwort3, daten[x-1].antwort4, daten[x-1].vorkommentar, daten[x-1].nachkommentar, daten[x-1].bildurl, daten[x-1].thema, &daten[x-1].schwierigkeit) == EOF)
    			break;
    		x++;
    	}
    	for (i = 0; i < x; i++)
    	{
    		printf("%s, %s, %s, %s, %s, %s, %s, %s, %s, %d\n", daten[i].frage, daten[i].richtigeAntwort, daten[i].antwort2, daten[i].antwort3, daten[i].antwort4, daten[i].vorkommentar, daten[i].nachkommentar, daten[i].bildurl, daten[i].thema, daten[i].schwierigkeit);
    	}
    	fflush(stdin);
    	getchar();
    	return 0;
    }
    

    In der CSV steht folgendes:

    Wie wird das windstille Zentrum eines Wirbelsturms genannt?;Auge;Herz;Hirn;Körper;;;;Erdkunde;3
    

    Kann mir hier jemand sagen warum ich diesen Fehler bekomme?



  • Die Warnung sagt doch genau, warum du sie bekommst. %[...] erwartet einen char* aber dein Argument Nr. 12 ist ein int* -> &daten[x-1].schwierigkeit

    Nimm halt %d



  • So wird das nichts.

    Was macht den scanf wenn es nichts zuweisen kann ? (zB bei ";;").
    Probiere das mal aus. Die Abfrage nach EOF ist ja ganz nett, aber
    andernfalls gibt sie die Anzahl gezogener Werte zurück.

    In Deinem Code wirst Du nicht ermitteln können, was überhaupt eingelesen
    wurde. Du solltest die Struktur vorher plattmachen (zB memset).

    Sinnvoll ist auf jeden Fall, die Datei zeilenweise in einen Puffer zu lesen,
    die Zeilenterminierung "\n" rauszuwerfen und dann den String zu parsen.
    Du kannst Dich nicht auf die Feldlängen verlassen ...

    Lies noch mal genau bei scanf nach. csv hat so seine Tücken 😉



  • Ich habs jetzt folgendermaßen gelöst:

    FILE    *fpData = NULL;        
    
    	if ( ( fpData = fopen( "test.csv", "r" ) ) == NULL ) //Reading a file
    	{
    		  printf( "File could not be opened.\n" );
    	}
    
    	while(fgets(buf, BUFFER_SIZE, fpData) != NULL)
    	{		
    		strcpy(daten[l].data1, strtok(buf,";")); 
    		printf("%s, ",daten[l].data1);
    
    		strcpy(daten[l].data2, strtok(NULL,";")); 
    		printf("%s, ",daten[l].data2 );
    
    		l++;
    
    	}
    	fclose(fpData);
    

Anmelden zum Antworten