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
dannwert1 = 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
dannwert1 = 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 -- > 119520896Bei 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 keinchar
-Array, sondern ein Zeiger auf einchar
.fgets
erwartet aber ein pointer to an array of chars where the string read is stored. Du könntest natürlich mitmalloc
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: 0CHECK 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: 1600CHECK 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 1Jo, 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: 0CHECK 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: 1600CHECK 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: 0CHECK zeile:1
Loop2 zeile:1 spalte 0 wert: 0CHECK 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: 1600hier 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