Strukturarray realloc? Malloc?
-
muss ich hier noch jedes Struktur element einzeln mit Speicher per malloc versorgen?
Weil der angegeben Code funktioniert nicht so ganz...
int count=0; // zähler wie viele eingaben struct dats * daten = NULL; FILE *fd; char trenner[] = "|"; int nRet; size_t *t = malloc(0); char **gptr = (char **)malloc(sizeof(char*)); *gptr = NULL; if ( (fd = fopen(datei,"r")) == NULL) { fprintf(stderr, "\nKonnte Datei %s nicht öffnen!", datei); exit(EXIT_FAILURE); } /* Datei zeilenweise einlesen */ while( (nRet=getline(gptr, t, fd)) > 0){ count++; daten = (struct dats*) realloc (daten, count * sizeof(struct dats)); if (daten==NULL) { puts ("Error (re)allocating memory"); exit (0); } strcpy(daten[count-1].date1,strsep(gptr,trenner)); strcpy(daten[count-1].date2,strsep(gptr,trenner)); }
gruß
Dominik
-
Das kommt ganz darauf an, wie dein struct definiert ist. Wenn die Elemente als char[] deklariert sind, werden sie mit angelegt (dann solltest du aber aufpassen, daß du nicht zu viele Daten reinkopierst), wenn du char*'s hast, mußt du denen noch gesondert Speicherplatz zuweisen.
-
struct dats { char date1[10]; char date2[10]; char date3[10]; };
so schaut meine Struktur aus.
Ich kann das ganze zwar durchlaufen, aber nur 6x mit einer Datei mit folgendem Inhalt246|1|2||.. 246|1|2||.. 246|1|2||.. 246|1|2||.. 246|1|2||.. 246|1|2||.. 297|1|12||..
Wenn ich Testweise ausgebe, bekomme ich 6x 246 ausgegeben und dann Speicherfehler?!
-
problem gelöst
Lag nicht an Struktur, lag an einem anderen Pointer (gptr - Zeileneinlesen)
Aber jetzt hab ich ein anderes kleines Problem
/* Variablendeklaration */ char *token; char *tmp; tmp=malloc(strlen(*gptr)+1); memcpy(tmp,gptr,strlen(*gptr)); token = strsep(tmp,trenner); /* Hinweis: "passing arg 1 of 'strsep' from incompatible pointer type */ strcpy(daten[count-1].date1,token);
Funktionieren tuts, aber 100% richtig ists ja nicht...
gruß
Dominik
-
token = strsep( &tmp, trenner);
Und wenn du eh schon nicht-ANSI Funktionen verwendest, dann kannst anstelle von
tmp=malloc(strlen(*gptr)+1); memcpy(tmp,gptr,strlen(*gptr));
auch gleich strdup() nehmen.
-
thx.
Was könnte das für Probleme bereiten mit nicht "ansi c" Funktion?
[quote]
The strsep() function is intended as a replacement for the strtok() func-
tion. While the strtok() function should be preferred for portability
reasons (it conforms to ANSI X3.159-1989 (``ANSI C'')) it is unable to
handle empty fields,...eigentlich hatte ich zuerst strtok, aber da es keine leeren Felder behandeln kann... [cpp] char **tmp;
jetzt gehts
-
freakx0 schrieb:
Was könnte das für Probleme bereiten mit nicht "ansi c" Funktion?
Portabilität ist im Eimer.