Datei strukturiert einlesen |
deppensido
Doppel-As
Dabei seit: 23.12.2012
Beiträge: 144
|
|
Datei strukturiert einlesen |
|
hallo,
ich will eine Datei strukturiert in ein 3-dimensionales Array einlesen. Dabei handelt es sich um kommaseparierte Werte (CSV) (Name, Geburtsdatum, Tag des Jahres). Dabei habe ich versucht mit den Funktionen fgets und strtok dies zu realisieren. Leider bekomme ich immer einen Speicherzugriffsfehler und wenn ich z.B. das Array auf 10,10,10 setze sieht man gleich, dass die Werte nicht richtig gespeichert werden. Hier mal mein Quellcode dazu:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
FILE* f;
f = fopen("text.csv", "r");
if(f == NULL) return 1;
char* words[1000][1000][1000] = {0};
char* ptr;
int i=1;
int j=1;
int k=1;
while(1) {
if ((ptr = malloc(sizeof(char))) == NULL) return -1;
if(fgets(ptr,128,f)) {
//Name speichern
ptr = strtok(ptr, ",");
words[i][0][0] = strdup(ptr);
//Geburtsdatum speichern
ptr = strtok(NULL, ",");
words[0][j][0] = strdup(ptr);
//Tag des Jahres speichern
ptr = strtok(NULL,"\n");
words[0][0][k] = strdup(ptr);
printf("%s %s %s\n",words[i][0][0], words[0][j][0], words[0][0][k]);
i++;
j++;
k++;
}
else break;
}
fclose(f);
return 0;
}
|
|
es geht eigentlich darum, das sogenannte Geburtstagsproblem zu analysieren, daher möchte ich zu einem Datum auch den dazugehörigen Namen leicht auslesen können. Weiß jemand vielleicht, warum das so nicht funktioniert und was ich ändern müsste? Die Datei habe ich als .txt hochgeladen. Ist im Original aber .csv Datei, aber das sollte eigentlich keinen Unterschied machen, da es von der Struktur genau gleich ist. Vielen Dank im voraus.
Dateianhang: |
text.txt (19,05 KB, 3.000 mal heruntergeladen)
|
|
|
08.07.2015 17:10 |
|
|
deppensido
Doppel-As
Dabei seit: 23.12.2012
Beiträge: 144
|
|
RE: Datei strukturiert einlesen |
|
Das Programm ist übrigens in C geschrieben. Ich hatte vergessen das zu erwähnen
|
|
08.07.2015 17:11 |
|
|
|
Wer das nicht als C erkennt, kann dir vermutlich auch nicht helfen.
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
FILE* f;
f = fopen("text.csv", "r");
if(f == NULL) return 1;
char* words[3][1000] = {0};
char* ptr;
char* parts;
int i=0, j;
if ((ptr = malloc(128*sizeof(char))) == NULL) return -1;
while(1) {
if(fgets(ptr,128,f)) {
parts = strtok(ptr, ",\n");
for(j=0;j<3;j++) {
words[j][i] = malloc(strlen(parts)*sizeof(char));
strcpy(words[j][i], parts);
parts = strtok(NULL, ",\n");
}
i++;
}
else break;
}
fclose(f);
int k;
for (k=0; k < i; k++) {
printf("%s %s %s\n",words[0][k], words[1][k], words[2][k]);
}
return 0;
} |
|
Die Speicherreservierung für ptr habe ich aus der Schleife herausgezogen und mit faktor 128 korrigiert (du willst ja 128 Zeichen einlesen).
Für words brauchst du viel mehr Speicher, als nötig (die Tabelle hat 3 Spalten, keine 1000).
Und du speicherst nicht den string selbst in der Tabelle, sondern nur einen Zeiger darauf. Wenn du die nächste Zeile einliest, ist der Inhalt auch schon wieder weg.
__________________ Syntax Highlighting fürs Board (Link)
|
|
08.07.2015 17:51 |
|
|
deppensido
Doppel-As
Dabei seit: 23.12.2012
Beiträge: 144
|
|
super, vielen Dank. Jetzt versteh ich auch, warum auch nicht die richtigen Werte gespeichert wurden, da ich immer nur einen Zeiger darauf gesetzt habe, statt den String per strcpy zu kopieren. Den Rest versteh ich auch. Genau so, wollte ich es haben
|
|
08.07.2015 18:13 |
|
|
|