Datei strukturiert einlesen

Neue Frage »

Auf diesen Beitrag antworten »
deppensido 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.
 
Auf diesen Beitrag antworten »
deppensido RE: Datei strukturiert einlesen

Das Programm ist übrigens in C geschrieben. Ich hatte vergessen das zu erwähnen
Auf diesen Beitrag antworten »
eulerscheZahl

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.
Auf diesen Beitrag antworten »
deppensido

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
 
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »