Probleme beim Einlesen einer CSV Datei in ein 2dArray.



  • monstermunchkin schrieb:

    Das wird so nicht gehen. Der schneidet Dir zuerst die Nachkommastellen ab und multipliziert dann mit 100. D. h. wenn buffer = 3.14 dann wert1 = 300 .
    EDIT 1: Gerade nochmal getestet: Der gibt Dir den ASCII-Wert von 3 zurück, also 51, und multipliziert dann mit 100.

    int wert1;
    wert1 = atof (buffer) * 100; // so ist's richtig
    

    irgendwie klappt das nicht wirklich!
    buffer -- > wert1
    14.00 -- > 1400
    1195209 -- > 119520896



  • lin123 schrieb:

    monstermunchkin schrieb:

    Das wird so nicht gehen. Der schneidet Dir zuerst die Nachkommastellen ab und multipliziert dann mit 100. D. h. wenn buffer = 3.14 dann wert1 = 300 .
    EDIT 1: Gerade nochmal getestet: Der gibt Dir den ASCII-Wert von 3 zurück, also 51, und multipliziert dann mit 100.

    int wert1;
    wert1 = atof (buffer) * 100; // so ist's richtig
    

    irgendwie klappt das nicht wirklich!
    buffer -- > wert1
    14.00 -- > 1400
    1195209 -- > 119520896

    Bei mir geht's:

    int foo;
    char bar[] = "3.14";
    foo = atof (bar) * 100;
    printf ("%d", foo); // Ausgabe: 314
    


  • komisch...
    und bei Werten ohne Nachkommastellen?



  • lin123 schrieb:

    komisch...
    und bei Werten ohne Nachkommastellen?

    Funktionert auch. Poste doch bitte mal Deinen Teil des Codes, falls er von obigem abweicht.



  • monstermunchkin schrieb:

    Die Schleife ab Zeile 33 würde ich in etwa so machen:

    ...
    while (fgets (buffer, line_max, file) && zeile < Zeilen) {
        spalte = 0;
        // deine if-Abfage bzgl. der Zeile
        if (zeile == 0) {
            ...
        } else {
            str = strtok (buffer, ",");
            while (str != NULL && spalte++ < Spalten) {
                arr[zeile][spalte] = atoi (str);
                str = strtok (NULL, ",");
            }
        }
        zeile++;
    }
    ...
    

    Gez. monstermunchkin

    Morgen,
    Mein Code funktionniert mehr oder weniger, das Problem ist ich bekomme Speicherzugriffsfehler unter Linux. Unter Windows steigt er bei der Ersten While Schleife aus "Runtime check failure" es geht um die Variablen buffer und str die nicht initialisiert sind.
    Ich habe Sie folgendermassen deklariert:

    char *str;
    char *buffer;
    

    Das mit den Nackommastellen Poste ich sofort! Wie du siehst bin ich ein zeimlicher Anfänger!! Vielen dank für deine Hinweise! das ist echt cool und hilft mir hier weiter!



  • So Hier ist meine gesamte Schleife:

    ...
    	int c=0;
    	int n=0;
    
    	int str_int=0;
    	float str_float=0;
    
    while(c!='\n'){
        c = fgetc (pFile);
        n++;
    }
    	printf ("\n(test)Zeichen in Zeile 1:%i ",n);
    
    rewind(pFile);
    
    int line_max = n;
    
    int zeile = 0;
    int spalte = 0; 
    
    char *buffer;
    char *str;
    
    while (fgets (buffer, line_max , pFile) && zeile < Zeilen) {
    	printf ("\n\n CHECK zeile:%i",zeile);//test
    	spalte = 0;
    	if (zeile == 0) {
    //		for (spalte=0; spalte < Spalten; spalte++){
    		for (spalte=0; spalte < 3; spalte++){
    			printf("\n Loop1 zeile:%i  spalte %i wert: %i" ,zeile,spalte,str_int); //test
    			csv_array[zeile][spalte] = 1; 
    		}
    	} 
    	else {
    		str = strtok (buffer, ","); 
    //			while (str != NULL && spalte < Spalten) {
    			while (str != NULL && spalte < 3) {
    			str_float = atof (str) * 100;
    			str_float = str_float + 0.5; //Damit richtig gerundet wird
    			str_int = (int)str_float;
    			csv_array[zeile][spalte] = str_int; 
    			printf("\n Loop2 zeile:%i  spalte %i wert: %i" ,zeile,spalte,str_int); //test
    			str = strtok (NULL, ","); 
    			spalte++;
    		}
    	}
    	zeile++;
    	//Vorläufiger Abbruch
    	if (zeile==5){
    		printf("\n\n");
    		break;
    	}
    }
    

    1. Problem. Er steigt immer mit einem Speicherzugriffsfehler aus und zwar in der letzten Zeile (ohne den vorläufigen Abbruch). Ich habe zuvor getestet ob ich in die letzte Zeile was reinschreiben kann und es ging! Deswegen glaube ich nicht daß es an der initialisierung des Arrays liegt.

    2. Problem. Hier ist der output:

    CHECK zeile:0
    Loop1 zeile:0 spalte 0 wert: 0
    Loop1 zeile:0 spalte 1 wert: 0
    Loop1 zeile:0 spalte 2 wert: 0
    //bis hier alles korrekt
    CHECK zeile:1
    Loop2 zeile:1 spalte 0 wert: 0
    //weil zeile=1 geht er zu Else aber schreibt keinen Wert in mein Array und springt direkt weiter
    CHECK zeile:2
    Loop2 zeile:2 spalte 0 wert: 119520896 (Falsch, sollte 119520900 sein)
    Loop2 zeile:2 spalte 1 wert: 1600 (richtig)
    Loop2 zeile:2 spalte 2 wert: 1600 (richtig)
    //Die Werte in diesem Block sind Zwar richtig aber gehören nicht zu Zeile2 sondern zu Zeile 1
    CHECK zeile:3
    Loop2 zeile:3 spalte 0 wert: 119521000 (richtig)
    Loop2 zeile:3 spalte 1 wert: 1600 (richtig)
    Loop2 zeile:3 spalte 2 wert: 1600 (richtig)
    //Läuft bis zur vorletzten zeilen durch und bring ein Speicherzugrifffehler
    CHECK zeile:4
    Loop2 zeile:4 spalte 0 wert: 119521104 (Falsch, sollte 119521100 sein)
    Loop2 zeile:4 spalte 1 wert: 1600 (richtig)
    Loop2 zeile:4 spalte 2 wert: 1600 (richtig)



  • lin123 schrieb:

    Ich habe Sie folgendermassen deklariert:

    char *str;
    char *buffer;
    

    Das mit den Nackommastellen Poste ich sofort! Wie du siehst bin ich ein zeimlicher Anfänger!! Vielen dank für deine Hinweise! das ist echt cool und hilft mir hier weiter!

    buffer ist nicht richtig. Du sagtest, dass die erste Zeile die längste ist, also hab ich das so gemacht:

    ...
    while ((c = fgetc (file)) != '\n') line_max++;
    char buffer[line_max+1]; // maximale Länge inkl. '\0'
    while (fgets (buffer, line_max, file) && zeile < 10) {
        ...
    }
    

    Dein buffer ist kein char -Array, sondern ein Zeiger auf ein char . fgets erwartet aber ein pointer to an array of chars where the string read is stored. Du könntest natürlich mit malloc arbeiten, aber ein Array (siehe oben) tut's auch.



  • Ok!! Nach dieser Änderung scheint das ganze schon viel gesünder!
    Leider überspringt er immernoch zeile 1
    output:
    CHECK zeile:0
    Loop1 zeile:0 spalte 0 wert: 0
    Loop1 zeile:0 spalte 1 wert: 0
    Loop1 zeile:0 spalte 2 wert: 0

    CHECK zeile:1 (das sind die werte aus zeile 2)
    Loop2 zeile:1 spalte 0 wert: 119521000 (richtig)
    Loop2 zeile:1 spalte 1 wert: 1600
    Loop2 zeile:1 spalte 2 wert: 1600

    CHECK zeile:2 (das sind die werte aus zeile 3)
    Loop2 zeile:2 spalte 0 wert: 119521104 (falsch)
    Loop2 zeile:2 spalte 1 wert: 1600
    Loop2 zeile:2 spalte 2 wert: 1600
    ...
    hast du eine Idee warum meine Zahlen nicht den richtigen Wert haben?



  • lin123 schrieb:

    Ok!! Nach dieser Änderung scheint das ganze schon viel gesünder!
    Leider überspringt er immernoch zeile 1

    Jo, dann musst du noch ein rewind reinpacken:

    ...
    while ((c = fgetc (file)) != '\n') line_max++;
    rewind (file);
    char buffer[line_max+1]; // maximale Länge inkl. '\0'
    while (fgets (buffer, line_max, file) && zeile < 10) {
        ...
    }
    

    lin123 schrieb:

    output:
    CHECK zeile:0
    Loop1 zeile:0 spalte 0 wert: 0
    Loop1 zeile:0 spalte 1 wert: 0
    Loop1 zeile:0 spalte 2 wert: 0

    CHECK zeile:1 (das sind die werte aus zeile 2)
    Loop2 zeile:1 spalte 0 wert: 119521000 (richtig)
    Loop2 zeile:1 spalte 1 wert: 1600
    Loop2 zeile:1 spalte 2 wert: 1600

    CHECK zeile:2 (das sind die werte aus zeile 3)
    Loop2 zeile:2 spalte 0 wert: 119521104 (falsch)
    Loop2 zeile:2 spalte 1 wert: 1600
    Loop2 zeile:2 spalte 2 wert: 1600
    ...
    hast du eine Idee warum meine Zahlen nicht den richtigen Wert haben?

    Was genau steht denn bei Zeile 2, Spalte 0 in der csv-Datei?



  • mit dem rewind an dieser Stelle habe ich wieder folgenden output:

    CHECK zeile:0
    Loop1 zeile:0 spalte 0 wert: 0
    Loop1 zeile:0 spalte 1 wert: 0
    Loop1 zeile:0 spalte 2 wert: 0

    CHECK zeile:1
    Loop2 zeile:1 spalte 0 wert: 0

    CHECK zeile:2 (Werte von Zeile 1)!
    Loop2 zeile:2 spalte 0 wert: 119520896
    Loop2 zeile:2 spalte 1 wert: 1600
    Loop2 zeile:2 spalte 2 wert: 1600

    hier ein Auschnitt aus der CSV

    "Element Number","Tsai_Wu ply 1","Tsai.......
    1195209,16.00,16.00,16.00,16.00,16.00,.......
    1195210,16.00,16.00,16.00,16.00,16.00,.......
    1195211,16.00,16.00,16.00,16.00,16.00,.......
    1195212,16.00,16.00,16.00,16.00,16.00,.......
    1195213,16.00,16.00,16.00,16.00,16.00,.......
    1195214,16.00,16.00,16.00,16.00,16.00,.......
    1195215,16.00,16.00,16.00,16.00,16.00,.......
    1195216,16.00,16.00,16.00,16.00,16.00,.......
    1195217,16.00,16.00,16.00,16.00,16.00,.......
    1195218,16.00,16.00,16.00,16.00,16.00,.......
    1195219,16.00,16.00,16.00,16.00,16.00,.......
    ......................................................



  • Hier nochmal die (jetzt) korrekte while -Schleife:

    while (fgets (buffer, line_max + 1, file) && zeile < 10) { // + 1 ist wichtig!
        spalte = 0;
        if (zeile == 0) {
            fgetc (file); // bei der ersten Zeile wird das '\n' nicht mitgelesen, deshalb erhält man in Zeile 1, Spalte 0 den Wert '0'
        } else {
            str = strtok (buffer, ",");
            while (str != NULL && spalte++ < 10) {
                arr[zeile][spalte] = atof (str) * 100;
                str = strtok (NULL, ",");
            }
        }
        zeile++;
    }
    

    Mein Output:

    Loop2 zeile: 1  spalte  0 wert: 119520900
     Loop2 zeile: 1  spalte  1 wert: 1600
     Loop2 zeile: 1  spalte  2 wert: 1600
     Loop2 zeile: 1  spalte  3 wert: 1600
     Loop2 zeile: 1  spalte  4 wert: 1600
     Loop2 zeile: 1  spalte  5 wert: 1600
     Loop2 zeile: 2  spalte  0 wert: 119521000
     Loop2 zeile: 2  spalte  1 wert: 1600
     Loop2 zeile: 2  spalte  2 wert: 1600
     Loop2 zeile: 2  spalte  3 wert: 1600
     Loop2 zeile: 2  spalte  4 wert: 1600
     Loop2 zeile: 2  spalte  5 wert: 1600
     Loop2 zeile: 3  spalte  0 wert: 119521100
     Loop2 zeile: 3  spalte  1 wert: 1600
     Loop2 zeile: 3  spalte  2 wert: 1600
     Loop2 zeile: 3  spalte  3 wert: 1600
     Loop2 zeile: 3  spalte  4 wert: 1600
     Loop2 zeile: 3  spalte  5 wert: 1600
    ...
    

    Ist doch korrekt, oder nicht?!



  • Juhu jetzt läuft das Ding unter linux!
    allerdings noch nicht unter windows..
    Erst mal vielen Dank! ohne Dich wäre ich bestimmt schon längst verzweifelt!
    Danke für deine Hinweise!
    Gruß,
    Lin


Anmelden zum Antworten