Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Datei strukturiert einlesen » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Datei strukturiert einlesen
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
deppensido
Doppel-As


Dabei seit: 23.12.2012
Beiträge: 144

Datei strukturiert einlesen Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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:
txt text.txt (19,05 KB, 3.000 mal heruntergeladen)
08.07.2015 17:10 deppensido ist offline Beiträge von deppensido suchen Nehmen Sie deppensido in Ihre Freundesliste auf
deppensido
Doppel-As


Dabei seit: 23.12.2012
Beiträge: 144

RE: Datei strukturiert einlesen Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Das Programm ist übrigens in C geschrieben. Ich hatte vergessen das zu erwähnen
08.07.2015 17:11 deppensido ist offline Beiträge von deppensido suchen Nehmen Sie deppensido in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
deppensido
Doppel-As


Dabei seit: 23.12.2012
Beiträge: 144

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 deppensido ist offline Beiträge von deppensido suchen Nehmen Sie deppensido in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Datei strukturiert einlesen