Problem: Abspeicher eines struct in eine Datei
-
Guten Abend,
Ich beschäftige mich seit kurzem mit C und möchte ein Adressprogramm schreiben.
Ich bin nun soweit das ich Daten ein- und ausgeben kann.
Nun möchte ich den struct binär in eine Datei speichern um es später wieder öffnen zu können.Zum speicher würde ich gern fwrite verwenden.
Hier der ausschnitt zum speichern:
void speichern() { struct angestellt *zeiger; FILE* datei; if ((datei = fopen(dateiname,"wb")) != NULL) { fwrite(zeiger,sizeof(struct angestellt),1,datei); fclose(datei); } else printf("\nDatei konnte nicht geoeffnet werden"); }
Und hier der komplette Code:
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 20 static char dateiname[] = "adressdatei.bin"; struct angestellt{ char name[MAX]; char vorname[MAX]; char strasse[MAX]; char stadt[MAX]; int hausnummer; long postleitzahl; struct angestellt *next; }; struct angestellt *next = NULL; struct angestellt *anfang = NULL; void anhaengen(char *n, char *v, char *s, int h, long plz, char *st) { struct angestellt *zeiger; if(anfang == NULL) { if((anfang = malloc(sizeof(struct angestellt))) == NULL) { fprintf(stderr, "Kein Speicherplatz vorhanden " "für anfang\n"); return; } strcpy(anfang->name, n); strcpy(anfang->vorname, v); strcpy(anfang->strasse, s); strcpy(anfang->stadt, st); anfang->hausnummer = h; anfang->postleitzahl = plz; anfang->next=NULL; } else { zeiger=anfang; while(zeiger->next != NULL) zeiger=zeiger->next; if((zeiger->next = malloc(sizeof(struct angestellt))) == NULL) { fprintf(stderr,"Kein Speicherplatz für das " "letzte Element\n"); return; } zeiger=zeiger->next; strcpy(zeiger->name,n); strcpy(zeiger->vorname,v); strcpy(zeiger->strasse,s); strcpy(zeiger->stadt,st); zeiger->hausnummer=h; zeiger->postleitzahl=plz; zeiger->next=NULL; } } void loesche(char *wen) { struct angestellt *zeiger, *zeiger1; if(anfang != NULL) { if(strcmp(anfang->name,wen) == 0) { zeiger=anfang->next; free(anfang); anfang=zeiger; } else { zeiger=anfang; while(zeiger->next != NULL) { zeiger1=zeiger->next; if(strcmp(zeiger1->name,wen) == 0) { zeiger->next=zeiger1->next; free(zeiger1); break; } zeiger=zeiger1; } } } else printf("Es sind keine Daten zum Loeschen vorhanden!!!\n"); } void ausgabe(void) { struct angestellt *zeiger = anfang; printf("||=====================================" "==================||\n"); while(zeiger != NULL) { printf("Name: %s,%s\nStrasse: %s: %d" "\nStadt: %ld,%c", zeiger->name,zeiger->vorname,zeiger->strasse, zeiger->hausnummer,zeiger->postleitzahl, zeiger->stadt); zeiger=zeiger->next; } } void eingabe(void) { char nam[MAX],vorn[MAX],strasse[MAX],stadt[MAX]; int h; long plz; char *ptr; printf("Name........................: "); fgets(nam, MAX, stdin); ptr = strrchr(nam, '\n'); *ptr = '\0'; printf("Vorname.....................: "); fgets(vorn, MAX, stdin); ptr = strrchr(vorn, '\n'); *ptr = '\0'; printf("Strasse.....................: "); fgets(strasse, MAX, stdin); ptr = strrchr(strasse, '\n'); *ptr = '\0'; printf("Hausnummer..................: "); scanf("%d",&h); printf("Postleitzahl................: "); scanf("%ld",&plz); printf("Stadt.......................: "); fgets(stadt, MAX, stdin); ptr = strrchr(stadt, '\n'); *ptr = '\0'; getchar(); fflush(stdin); anhaengen(nam, vorn, strasse, h, plz, stadt); } void speichern() { struct angestellt *zeiger; FILE* datei; if ((datei = fopen(dateiname,"wb")) != NULL) { fwrite(zeiger,sizeof(struct angestellt),1,datei); fclose(datei); } else printf("\nDatei konnte nicht geoeffnet werden"); } int main(void) { int wahl; char dname[MAX]; do { printf("\n1 : Eingabe\n"); printf("2 : Ausgabe\n"); printf("3 : Namen loeschen\n"); printf("9 : Ende\n"); printf("Ihre Wahl : "); scanf("%d",&wahl); getchar(); switch(wahl) { case 1 : eingabe(); break; case 2 : ausgabe(); break; case 3 : printf("Der Name zum Loeschen: "); fgets(dname, MAX, stdin); loesche(strtok(dname, "\n")); break; case 4 : speichern(); break; case 9 : break; default: printf("Falsche Eingabe!!!\n"); } } while(wahl != 9); return EXIT_SUCCESS; }
Kann jemand den Fehler erkennen?
Vielen Dank schonmal
-
Du hast dein Problem nicht beschrieben.
zeiger ist ein loakaler nicht initialisierter Zeiger.
Du solltest der Funktion schon die Daten (und den Dateinamen) irgendwie mitgeben.
-
Ersetzte das "irgendwie" durch "als Parameter"
-
Dank das mit "zeiger" hab ich übersehn.
Habe es nun umgeschrieben.void speichern() { struct angestellt *zeiger; FILE *datei; if ((datei = fopen(dateiname,"wb")) != NULL) { zeiger=anfang; while(zeiger != NULL) { fwrite(zeiger,sizeof(struct angestellt),1,datei); zeiger=zeiger->next; } fclose(datei); } else printf("\nDatei konnte nicht geoeffnet werden"); }
Es wird nun in die Datei geschrieben. Allerdings sind da auch für mich unbekannte Zeichen zu sehen:
aaa ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍaaa ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍaaa ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ 90 m bbb ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍbbb ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍbbb ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ 90
Ist das normal wenn binär geschrieben wird?
-
Marco1503 schrieb:
Es wird nun in die Datei geschrieben. Allerdings sind da auch für mich unbekannte Zeichen zu sehen:
aaa ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍaaa ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍaaa ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ 90 m bbb ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍbbb ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍbbb ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ 90
Ist das normal wenn binär geschrieben wird?
Was erwartest du?
Wenn du nur 3 Zeichen in Feld mit 20 Elementen schreibst, dann sind da noch 16 frei. Da steht halt das drin, was vorher im Speicher war.
Du speicherst allerdings auch das Feld next ab.
Das ergibt beim einlesen allerdings großen Unsinn, da die Struktur dann (wahrscheinlich) an einem anderen Speicherplatz liegt.Wenn du die Daten auf einem (ganz) anderen System einlesen willst, kann das auch Schwierigkeiten geben.