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

Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Datei strukturiert einlesen » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 4 Beiträge
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
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.
deppensido RE: Datei strukturiert einlesen

Das Programm ist übrigens in C geschrieben. Ich hatte vergessen das zu erwähnen
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.

Dateianhang:
txt text.txt (19,05 KB, 2.995 mal heruntergeladen)