Einfach verkettete Liste
-
Schreib doch das was Du mit printf() ausgibst gleich nochmal mit fprintf() in die Datei und fertig.
-
hmm so einfach gehts irgendwie net
fprintf(fp, "%s", write);
da kommt en fatal error...unresolved externals...was auch immer das heisen mag
-
erstens: ist 'write' ein String? Wenn nein, dürftest du dir spätestens bei der Ausführung ein Problem einfangen.
zweitens: zeig mal etwas mehr Code - und die genaue Fehlermeldung.
-
write ist ein Pointer vom Typ List.
void write_Data(struct List * write) { FILE *fp; fp = fopen("TEST.BIN", "a+"); //fwrite(write, sizeof(UseData), 1, fp); fprintf(fp, "%s", write); fclose(fp); }
void print_list(void) { while(start != NULL) { write_data(start->info); printf("\n Der Name ist %s mit der zugehoerigen ID: %lf", start->info.name, start->info.counter); start = start->next; } }
ich übergebe der Funktion den Info Pointer auf meine Nutzdaten struktur
-
Hab ich's mir doch gedacht
Da mußt du dich natürlich durchhangeln bis zu dem Teil der Struktur, die dich interessiert:
fprintf(fd,"%i:%s ",write->info->counter,write->info->name); //oder fwrite(write->info,sizeof(UseData),1,fd);
Aber was genau ist eigentlich der Fehler?
(btw solltest du der print_list den Startpunkt als Parameter übergeben - du operierst auf globalen Daten und das könnte unangenehm werden)
-
hmm deinen letzten satz versteh ich nicht. was meinst mit unangenehm? wieso?
-
Du schiebst den globalen Zeiger 'start' im Laufe der Funktion durch die gesamte Liste. Das bedeutet, daß am Ende vermutlich niemand mehr weiß, wo deine Liste angefangen hat.
(außerdem schränkt es das Design sehr ein, wenn du nur EINE EINZIGE Liste ausgeben kannst)
-
hmm stimmt, werde das noch ändern,
die Zeiger muss ich aber dann in der header deklarieren oder? sonst bekomm ich ja keinen zugriff daruaf in den anderen dateien.
hab jetzt noch das problem mit fwrite
void write_Data(struct list *write) { FILE *fp; fp = fopen("TEST.BIN", "a+"); //fwrite(write, sizeof(UseData), 1, fp); //fprintf(fp,"%i:%s ",write->info.counter,write->info.name); fwrite(write->info, sizeof(UseData), 1, fp); fclose(fp); }
bekomme immer diese Meldung.
error C2172: 'fwrite' : actual parameter is not a pointer : parameter 1
beim fprintf kommt gleich noch en Fatal error
hier nochmal der funktionsaufruf
void print_list(void) { while(start != NULL) { write_Data(start); printf("\n Der Name ist %s mit der zugehoerigen ID: %lf", start->info.name, start->info.counter); start = start->next; } }
-
void print_list(void) { FILE *fp; fp = fopen("TEST.BIN", "a+"); while(start != NULL) { printf("\n Der Name ist %s mit der zugehoerigen ID: %lf", start->info.name, start->info.counter); fprintf(fp, "\n Der Name ist %s mit der zugehoerigen ID: %lf", start->info.name, start->info.counter); start = start->next; } fclose(fp); }
-
Also Thx, so funktioniert es erstmal, möchte das jedoch in ner extra Funktion in nem extra Modul realisieren, geht das nicht?
-
CStoll schrieb:
Du schiebst den globalen Zeiger 'start' im Laufe der Funktion durch die gesamte Liste. Das bedeutet, daß am Ende vermutlich niemand mehr weiß, wo deine Liste angefangen hat.
(außerdem schränkt es das Design sehr ein, wenn du nur EINE EINZIGE Liste ausgeben kannst)
#include <stdio.h> #include <stdlib.h> #define MAX 20 typedef struct usedata { int counter; char name[MAX]; } UseData; typedef struct list { UseData info; struct list *next; } List; void create_list(List**, List**, List**); void print_list(List*, int); void write_list(List* , int); void free_all(List*, int); int main(void) { List* begin = 0, *start = 0, *temp = 0; List** pbegin = &begin; List** pstart = &start; List** ptemp = &temp; int z = 0; int anz = 0; printf("\nWieviele Datenstrukturen moechten Sie erzeugen: "); scanf("%i", &anz), fflush(stdin); create_list(pbegin, pstart, ptemp); for (z; z < anz; z++) { printf("\nBitte geben Sie Name und ID ein: "); scanf("%s", start->info.name), fflush(stdin); scanf("%d", &start->info.counter), fflush(stdin); create_list(pbegin, pstart, ptemp); } print_list(begin, anz); write_list(begin, anz); free_all(begin, anz); return 0; } void create_list(List** pbegin, List** pstart, List** ptemp) { *pstart = malloc(sizeof(struct list)); if(*pstart == NULL) fprintf(stderr, "Memory not available"); if (*pbegin == 0 ) *pbegin = *pstart; else (*ptemp)->next = *pstart; *ptemp = *pstart; } void print_list(List* begin, int anz) { List* start; start = begin; while(anz--) { printf(" Der Name ist %s mit der zugehoerigen ID: %d\n", start->info.name, start->info.counter); start = start->next; } } void free_all(List* begin ,int anz) { List* start, *temp; start = begin; while(anz--) { temp = start->next; free(start); start = temp; } } void write_list(List* begin, int anz) { FILE *fptr; List* start; start = begin; fptr = fopen("TEST.BIN", "a+"); while(anz--) { fprintf(fptr, "\n Der Name ist %s mit der zugehoerigen ID: %d", start->info.name, start->info.counter); start = start->next; } fclose(fptr); }
mfg
-
Cool Danke, das mit den doppelpointern ist mir noch net ganz klar aber das bekomm ich schon noch hin.
Danke euch allen nochmals für die hilfe