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: |
text.txt (19,05 KB, 2.995 mal heruntergeladen)
|
|
|
|