incompatible typen
-
Hi,
ich komme mit dem Fehler nicht weiter. Erstmal kurze Erklärung:
typedef struct knot { struct dat { char name[16]; char alter[8]; } knot;
jetzt versuche ich ein String einzulesen aus der datei und dann nach ";" parsen.
knot *elem = malloc(sizeof *elem); FILE *fd; char *datei = "test.txt"; char *string; int nRet; size_t *t = malloc(0); if ( (fd = fopen(datei,"r")) == NULL) { fprintf(stderr, "\nKonnte Datei %s nicht öffnen!\n", datei); }else while( (nRet=getline(string, t, fd)) > 0){ elem->dat.name = strtok(string, ";"); elem->dat.alter = strtok(NULL, ";"); }
Fehler bei der Compilierung sind die letzen 2 Zeilen.
error: incompatible types in assignment
elem->dat.name = strtok(string, ";"); elem->dat.alter = strtok(NULL, ";");
Wie kann ich es richtig casten?
Danke im voraus.
mfg
-
du kannst arrays nichts zuweisen, name & alter sind Arrays, keine Zeiger und strtok liefert einen Zeiger zurück. Entweder benutzt du strcpy oder deklarierst du name & alter als Zeiger (ich würde das erste wählen)
-
char *name = strtok(string,"|"); knot->dat.name = name;
So was?
-
nein, weil name wieder ein Zeiger ist, und dat.name ein Array.
-
Hi,
also mit
strcpy(knot->dat.name, strtok(string,"|");
nimmt es zwar an aber da kommen komische Warnungen. Und mein Programm schmiert mit Segment fault ab.
Kanns mal bitte schreiben, was du damit genau meinst? (BITTE)
danke im voraus.
mfgnoobyTron
-
dein Programm schmiert aber nicht deswegen ab, sondern vermutlich wegen getline. Keine Ahnung, woher du diese Funktion hast, ich kenne eine getline, die aber eine GNU Erweiterung ist und somit nur mit dem GNU GCC (bzw. >=libc 4.6.27) funktioniert und diese so aussieht:
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
In diesem Fall musst du folgendes schreiben
char *string = NULL; int nRet; size_t t; ... while( (nRet=getline(&string, &t, fd)) > 0){ // do some stuff free(string); }
btw. weiß nicht, welchen Sinn malloc(0) hat, vielleicht ist das auch der Grund, warum dein programm abschmiert, oder strtok NULL zurückliefert. Deswegen MUSS man immer überprüfen, ob eine Funktionen einen NULL Pinter zurückliefert oder nicht !!!
// edit: ich verstehe nicht, wie du dein struct aufgebaut hast... mach es lieber so
typdef struct knot { char name[16]; char alter[8]; } knot_t; ... char *tmp; knot_t *elem = malloc(sizeof(knot_t)); ... while(...) { tmp = strtok(string, ";"); if(tmp == NULL) { FEHLER!!!!! } strcpy(elem->name, tmp); tmp = strtok(NULL, ";"); if(tmp == NULL) { FEHLER!!!!! } strcpy(elem->alter, tmp); ... }
-
Da irgendwie damit nicht klar komme, wie kann ich noch eine Datei zeilenweise auslesen (ausser getline)?
Ich habe getchar gesehen, aber der gib mir den kompletten Dateiinhalt, das Problem ist ich muss den String parsen.
Und da habe ich noch keine Ansatz/Wissen.Danke im voraus. (sry für meine Fragen)
mfg
-
Die Antwort ist wie so oft fgets()
-
noobyTron schrieb:
Da irgendwie damit nicht klar komme, wie kann ich noch eine Datei zeilenweise auslesen (ausser getline)?
Ich habe getchar gesehen, aber der gib mir den kompletten Dateiinhalt, das Problem ist ich muss den String parsen.
Und da habe ich noch keine Ansatz/Wissen.Danke im voraus. (sry für meine Fragen)
mfg
getchar liest nicht die gesamte Datei aus sondern ein Zeichen aus stdin. An deiner Stelle würde ich zuerst die Dokumentation der ANSI C Funktionen, denn du scheinst gar nicht zu wissen, was sie überhaupt machen.
Um Zeilenweise zu lesen: man: fgets(3)
-
Danke @all!
Habe es jetzt mit fgets
geschaft!
Danke nochmal für die gespendete Zeit/Aufmerksamkeit!