einfach verkettete Liste aus einer Textdatei laden
-
Mahlzeit,
habe auch ein Problem mit dem laden meiner Liste.
Ich kann zwar laden, jedoch lädt er nur mein ersten "Artikel" aus meiner Struktur von insgesamt dreien, die ich abgespeichert habe.FILE *fp; fp = fopen( "Lagerverwaltung.txt", "r"); while(fread(&lager_daten, sizeof(struct lagerverwaltung),1,fp)) { if(head == NULL) { head = (struct lagerverwaltung *)malloc(sizeof(struct lagerverwaltung)); if(head == NULL) { printf("Speichermangel!!\n"); exit(0); } else { head->Artikelnummer = lager_daten.Artikelnummer; strcpy(head->Bezeichnung, lager_daten.Bezeichnung); head->Preis = lager_daten.Preis; head->Anzahl = lager_daten.Anzahl; head->next = NULL; } } else { lager_ptr = head; while(lager_ptr->next != NULL) lager_ptr = lager_ptr->next; lager_ptr->Artikelnummer = lager_daten.Artikelnummer; strcpy(lager_ptr->Bezeichnung, lager_daten.Bezeichnung); lager_ptr->Preis = lager_daten.Preis; lager_ptr->Anzahl = lager_daten.Anzahl; lager_ptr->next = NULL; }
Hoffe ihr jemand kann mir helfen, würde mich freuen.
Bis dann
-
So wie ich das überblicke ist am Anfang dein head gleich 0, du überschreibst head mit neuen Werten, dann für die zweite Struktur ist head ungleich 0 weil es gerade überschrieben wurde und wird wieder überschrieben. Damit speicherst du die erste Struktur, dann speicherst du die zweite über die erste, dann die dritte drüber.
Zwischen Zeile 28 und 29 sollte sowas wie lager_ptr->next = malloc(sizeof *lager_ptr->next); stehen und du musst alles in lager_ptr->next speichern, nicht in lager_ptr.
-
nwp2 schrieb:
So wie ich das überblicke ist am Anfang dein head gleich 0, du überschreibst head mit neuen Werten, dann für die zweite Struktur ist head ungleich 0 weil es gerade überschrieben wurde und wird wieder überschrieben. Damit speicherst du die erste Struktur, dann speicherst du die zweite über die erste, dann die dritte drüber.
Zwischen Zeile 28 und 29 sollte sowas wie lager_ptr->next = malloc(sizeof *lager_ptr->next); stehen und du musst alles in lager_ptr->next speichern, nicht in lager_ptr.Hmm... Er gibt mir eine Fehlermeldung, wenn ich
lager_ptr->next = malloc(sizeof *lager_ptr->next);
an die von dir genannte stelle eingebe.
Fehlermeldung:
error C2440: '=': 'void *' kann nicht in 'lagerverwaltung *' konvertiert werden
Was meinst du eigentlich mit dem
alles in lager_ptr->next speichern, nicht in lager_ptr
?
Ich habe mal meine komplette Speicher/Lade-Funktion beigefügt vielleicht hilft das hja weiter:
void SpeichernLaden() { char auswahl; char dateiname[20]; struct lagerverwaltung *lager_ptr, lager_daten; system("cls"); printf("Waehlen Sie aus: \n"); printf("<S>peichern\n"); printf("<L>aden\n\n"); printf("<B>eenden\n\n"); do { scanf("%c", &auswahl); if(auswahl == 'S' || auswahl == 's') { printf("\nGeben Sie einen Dateinamen ein (z.B.: Test.txt): "); scanf("%s", dateiname); FILE *fp; fp = fopen(dateiname, "wb"); lager_ptr = head; if(lager_ptr == NULL) { printf("\nListe ist leer!\n\n"); return; } while(lager_ptr != NULL) { fwrite(lager_ptr, sizeof(struct lagerverwaltung),1,fp); lager_ptr = lager_ptr->next; } fclose(fp); printf("\nSpeichern erfolgreich abgeschlossen!\n\n\n"); _getch(); system("cls"); break; } if(auswahl == 'L' || auswahl == 'l') { FILE *fp; fp = fopen( "Lagerverwaltung.txt", "r"); while(fread(&lager_daten, sizeof(struct lagerverwaltung),1,fp)) { if(head == NULL) { head = (struct lagerverwaltung *)malloc(sizeof(struct lagerverwaltung)); if(head == NULL) { printf("Speichermangel!!\n"); exit(0); } else { head->Artikelnummer = lager_daten.Artikelnummer; strcpy(head->Bezeichnung, lager_daten.Bezeichnung); head->Preis = lager_daten.Preis; head->Anzahl = lager_daten.Anzahl; head->next = NULL; } } else { lager_ptr = head; while(lager_ptr->next != NULL) lager_ptr = lager_ptr->next; lager_ptr->next = malloc(sizeof *lager_ptr->next); lager_ptr->Artikelnummer = lager_daten.Artikelnummer; strcpy(lager_ptr->Bezeichnung, lager_daten.Bezeichnung); lager_ptr->Preis = lager_daten.Preis; lager_ptr->Anzahl = lager_daten.Anzahl; lager_ptr->next = NULL; } } fclose(fp); system("cls"); break; } if(auswahl == 'B' || auswahl == 'b') break; }while(1); }
-
FreshAC schrieb:
Hmm... Er gibt mir eine Fehlermeldung, wenn ich
lager_ptr->next = malloc(sizeof *lager_ptr->next);
an die von dir genannte stelle eingebe.
Das liegt daran dass du einen C++-Compiler und keinen C-Compiler verwendest. Unter C++ musst du malloc casten, also lager_ptr->next = (struct lagerverwaltung *)malloc(sizeof *lager_ptr->next);
FreshAC schrieb:
Was meinst du eigentlich mit dem
alles in lager_ptr->next speichern, nicht in lager_ptr
?
Du hast deinen lager pointer, dort speicherst du deine Struktur. Die nächste Struktur musst du dann in lager_ptr->next speichern, die nächste dann in lager_ptr->next->next. Wenn du bis zur letzten Struktur wanderst musst du die nächste dann in lager_ptr->next speichern. Wenn du es in lager_ptr speicherst überschreibst du deine letzte Struktur.
-
FreshAC schrieb:
error C2440: '=': 'void *' kann nicht in 'lagerverwaltung *' konvertiert werden
du verwendest nen c++ compieler? versuch mal .c als datei endung
findest du
malloc(sizeof(struct lagerverwaltung)) nicht auch viel schöner als malloc(sizeof *lager_ptr->next)
??
wenn du den ersten fehler nichtmehr bekommst kannst es auch sein lassen den rückgabewert von malloc zu casten
-
Das liegt daran dass du einen C++-Compiler und keinen C-Compiler verwendest. Unter C++ musst du malloc casten, also lager_ptr->next = (struct lagerverwaltung *)malloc(sizeof *lager_ptr->next);
Also der Fehler wird nicht mehr angezeigt.
Du hast deinen lager pointer, dort speicherst du deine Struktur. Die nächste Struktur musst du dann in lager_ptr->next speichern, die nächste dann in lager_ptr->next->next. Wenn du bis zur letzten Struktur wanderst musst du die nächste dann in lager_ptr->next speichern. Wenn du es in lager_ptr speicherst überschreibst du deine letzte Struktur.
Verstehe ich das richtig, dass es bei der speicher Funktion dann so aussehen muss:
if(auswahl == 'S' || auswahl == 's') { printf("\nGeben Sie einen Dateinamen ein (z.B.: Test.txt): "); scanf("%s", dateiname); FILE *fp; fp = fopen(dateiname, "wb"); lager_ptr->next = head; if(lager_ptr->next == NULL) { printf("\nListe ist leer!\n\n"); return; } while(lager_ptr->next != NULL) { fwrite(lager_ptr->next, sizeof(struct lagerverwaltung),1,fp); lager_ptr->next = lager_ptr->next->next; } fclose(fp); printf("\nSpeichern erfolgreich abgeschlossen!\n\n\n"); _getch(); system("cls"); break;
-
Ne.
while(lager_ptr->next != NULL) lager_ptr = lager_ptr->next; //bis zum letzten Element springen lager_ptr->next = (struct lagerverwaltung *)malloc(sizeof *lager_ptr->next); //Speicher für neues Element holen lager_ptr->next->next = NULL; //neues letztes Element lager_ptr->next->Artikelnummer = bla; //gerade mit fread gelesene Werte in neue Struktur eintragen lager_ptr->next->... = ...; ...
-
lager_ptr->next = head; :confused: while(lager_ptr != NULL) { fwrite(lager_ptr, sizeof(struct lagerverwaltung),1,fp); lager_ptr = lager_ptr->next; }
-
nwp2 schrieb:
lager_ptr->next->Artikelnummer = bla; //gerade mit fread gelesene Werte in neue Struktur eintragen
nene...
lager_ptr = lager_ptr->next; lager_ptr->Artikelnummer = bla; //gerade mit fread gelesene Werte in neue Struktur eintragen ...
-
@nwp2 & nooblolo: Vielen Dank. Es funktioniert endlich. Ich war schon echt am verzweifeln. Viel Dank nochmal.