Laden aus Datei mit fread



  • Hi, ich hab folgendes Problem. Meine Ladenfunktion ( KontoLoad ), will nicht so wie ich will. Immer wenn ich Laden versuche auszuführen, bekomm ich entweder nen Runtime Fehler #2. da ich nun schon seit 5 std vor dem Problem sitze verzweifle ich langsam.

    Ich hoffe ihr könnt mir weiterhelfen, weil sonst beis ich gleich meinen rechner..

    #include <stdio.h>
    #include <stdlib.h>
    
    struct Buchung
    {
    	char datum[10];
    	char betrag[10];
    	int art;
    	char text[100];
    };
    
    struct Knot
    {
    	struct Buchung *buchung;
    	struct Knot *next;
    };
    
    struct ListHead
    {
    	char vorname[40];
    	char nachname[40];
    	char kontonummer[40];
    	char blz[40];
    	char bankname[100];
    	char betrag[10];
    	struct Knot *head;
    	struct Knot *tail;
    	int anzahl;
    };
    
    struct ListHead *ListCreate(void)
    {
    	struct ListHead *head=malloc(sizeof(struct ListHead));
    
    	if(head)
    	{
    		head->head=head->tail=0;
    		return(head);
    	}
    	return(0);
    }
    
    int CreateKonto(struct ListHead *hd)
    {
    	if(hd) {
    		printf("\n\nVorname : ");
    		fscanf(stdin, "%s", hd->vorname);
    		fflush(stdin);
    		printf("Nachname : ");
    		fscanf(stdin, "%s", hd->nachname);
    		fflush(stdin);
    		printf("Kontonummer : ");
    		fscanf(stdin, "%s", hd->kontonummer);
    		fflush(stdin);
    		printf("Bankleitzahl : ");
    		fscanf(stdin, "%s", hd->blz);
    		fflush(stdin);
    		printf("Name der Bank : ");
    		gets(hd->bankname);
    		fflush(stdin);
    		printf("Anfangsguthaben : ");
    		fscanf(stdin, "%s", hd->betrag);
    		fflush(stdin);
    	}
    	return(0);
    }
    int ListAppend(struct ListHead *hd, struct Buchung *bg)
    {
    	struct Knot *ap=malloc(sizeof(struct Knot));
    
    	if(ap)
    	{
    		ap->buchung=bg;
    		ap->next=0;
    		if(!(hd->head))
    		{
    			hd->head=hd->tail=ap;
    			hd->anzahl+=1;
    			return(1);
    		} else {
    			hd->tail->next=ap;
    			hd->tail=ap;
    			hd->anzahl+=1;
    			return(1);
    		}
    	}
    	return(0);
    }
    
    void ListDelAll(struct ListHead *hd)
    {
    	struct Knot *cur=hd->head;
    	struct Knot *nex;
    
    	while(cur)
    	{
    		nex=cur->next;
    		free(cur->buchung);
    		free(cur);
    		cur=nex;
    	}
    	free(hd);
    }
    int PruefDate(char *date)
    {
    	char day[2],month[2],year[4];
    	int d,m,y,pruef;
    	day[0] = date[0];
    	day[1] = date[1];
    	month[0] = date[3];
    	month[1] = date[4];
    	year[0] = date[6];
    	year[1] = date[7];
    	year[2] = date[8];
    	year[3] = date[9];
    	d = atoi(day);
    	m = atoi(month);
    	y = atoi(year);
    	if(m > 0 && m < 13) {
    		if(m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {
    			if(d > 0 && d < 31) {
    				pruef=0;
    			} else {
    				pruef=1;
    			}
    		} else if(m == 4 || m == 6 || m == 9 || m == 11) {
    			if(d > 0 && d < 30) {
    				pruef=0;
    			} else {
    				pruef=1;
    			}
    		} else {
    			if(y%4!=0) {
    			    if(d > 0 && d < 28) {
    					pruef=0;
    				} else {
    					pruef=1;
    				}
    			} else {
    				if(d > 0 && d < 29) {
    					pruef=0;
    				} else {
    					pruef=1;
    				}
    			}
    		}
    	} else {
    		pruef=1;
    	}
    
    	if(pruef == 1) {
    		system("cls");
    		printf("\nFehler : Datum bitte erneut eingeben.\n\n");
    		return 1;
    	} else {
    		return 0;
    	}
    }
    
    int ListInput(struct ListHead *hd)
    {
    	int z=1;
    	char zw;
    	struct Buchung *dat=malloc(sizeof(struct Buchung));
    	if(dat)
    	{
    		do {
                printf("Datum	: ");
    			fscanf(stdin, "%8s", dat->datum);
    			fflush(stdin);
    			z=PruefDate(dat->datum);
    		} while(z);
    		z=1;
    		printf("Betrag : ");
    		fscanf(stdin, "%s", dat->betrag);
    		fflush(stdin);
    		do {
                printf("Zu- oder Abgang : ");
    			fscanf(stdin, "%c", &zw);
    			fflush(stdin);
    			if(zw == 'A' || zw == 'a') {
    				dat->art=0;
    				z=0;
    			} else if (zw == 'Z' || zw == 'z') {
    				dat->art=1;
    				z=0;
    			} else {
    				printf("\nFehler : Bitte Buchungsart erneut eingeben.\n\n");
    			}
    		} while (z);
    		printf("Buchungstext : ");
    		gets(dat->text);
    		fflush(stdin);
    
    		if(ListAppend(hd,dat))
    		{
    			return(0);
    		} else {
    			free(dat);
    			return(0);
    		}
    	} else {
    		return(0);
    	}
    }
    
    void ListShow(struct ListHead *hd)
    {
    	struct Knot *cur=hd->head;
    	char z;
    	if(!cur)
    	{
    		printf("Keine Buchungen vorhanden!\n");
    		return;
    	}
    
    	while(cur)
    	{
    		if(cur->buchung->art != 1 ) {
    			z='A';
    		} else {
    			z='Z';
    		}
    		printf("%s\t%c\t%5.2f Euro\t%s\n",
    			cur->buchung->datum,
    			z,
    			atof(cur->buchung->betrag),
    			cur->buchung->text);
    		cur=cur->next;
    	}
    	getchar();
    }
    
    void ListKonto(struct ListHead *hd)
    {
    	struct Knot	*cur=hd->head;
    	float erg;
    	erg = atof(hd->betrag);
    
    	while(cur)
    	{
    		if(cur->buchung->art != 1 ) {
    			erg = erg - atof(cur->buchung->betrag);
    		} else {
    			erg = erg + atof(cur->buchung->betrag);
    		}
    		cur=cur->next;
    	}
    	printf("\nDas Konto gehoert : %s %s\n", hd->vorname, hd->nachname);
    	printf("Kontonummer : %s Bankleitzahl : %s\n", hd->kontonummer, hd->blz);
    	printf("Name der Bank : %s\n", hd->bankname);
    	printf("Der Kontostand betraegt : %.2f Euro\n\n", erg);
    	getchar();
    	system("cls");
    }
    
    void ListKontostand(struct ListHead *hd)
    {
    	struct Knot	*cur=hd->head;
    	float erg;
    	erg = atof(hd->betrag);
    
    	while(cur)
    	{
    		if(cur->buchung->art != 1 ) {
    			erg = erg - atof(cur->buchung->betrag);
    		} else {
    			erg = erg + atof(cur->buchung->betrag);
    		}
    		cur=cur->next;
    	}
    	printf("\n\nDer Kontostand betraegt : %.2f Euro\n\n", erg);
    	getchar();
    }
    void KontoSave(struct ListHead *hd)
    {
    	struct Knot *cur=hd->head;
    	struct Buchung *buch;
    	FILE *fp;
    	if((fp = fopen("bank.xan", "wb+")) != NULL) {
    		fwrite(hd, sizeof(struct ListHead), 1, fp);
    		while(cur != NULL) {
    			buch=cur->buchung;
    			fwrite(buch, sizeof(struct Buchung), 1, fp);
    			cur=cur->next;
    		}
    		system("cls");
    		printf("\nKonto erfolgreich gespeichert.\n\n");
    	}
    	fclose(fp);
    }
    void KontoLoad(struct ListHead *hd)
    {
    	struct Buchung *buch;
    	struct Knot *cur=malloc (sizeof(struct Knot));
    	struct Knot *anf=hd->head;
    	struct Knot *end=hd->tail;
    	FILE *fp;
    	if((fp = fopen("bank.xan", "rb")) != NULL) {
    		fread(hd, sizeof(struct ListHead), 1, fp);
    		hd->anzahl=0;
    		while(fread(&buch, sizeof(struct Buchung), 1, fp)) {
    			if(ListAppend(hd,buch))
    			{
    				return(0);
    			} else {
    				free(buch);
    				return(0);
    			}
    		}
    		system("cls");
    		printf("\nKonto erfolgreich geladen.\n\n");
    	}
    	fclose(fp);
    }
    
    void DelOne(struct ListHead *hd)
    {
    	struct Knot *cur=hd->head;
    	struct Knot *loe=hd->tail;
    
    	while(cur)
    	{
    		if(cur->next == loe) {
    			free(loe->buchung);
    			free(loe);
    			cur->next=0;
    		} else {
                cur=cur->next;
    		}
    	}
    }
    
    void PrintHelp(void)
    {
    	system("cls");
    	printf("noch machen\n");
    	getchar();
    }
    void main(void)
    {
    	struct ListHead *liste;
    	int eingabe, eingabe2;
    	liste=ListCreate();
    	liste->anzahl=0;
    	if(liste)
    	{
    		do {
    			printf("\nKonto erstellen		- 1 \n");
    			printf("Konto laden		- 2\n");
    			printf("Konto speichern		- 3\n");
    			printf("Konto verwalten		- 4\n");
    			printf("Kontodaten pruefen	- 5\n");
    			printf("Hilfe ausgeben		- 6\n");
    			printf("\n\nProgramm beenden	- 0\n");
    			printf("Eingabe : ");
    			scanf("%i", &eingabe);
    			getchar();
    			switch(eingabe) {
    				case 1 : CreateKonto(liste); system("cls"); break;
    				case 2 : KontoLoad(liste); break;
    				case 3 : KontoSave(liste); break;
    				case 4 : do {
    							system("cls");
    							printf("\nBuchungen hinzufuegen	- 1\n");
    							printf("Letzte Buchung loeschen	- 2\n");
    							printf("Kontouebersicht		- 3\n");
    							printf("Kontostand abfragen	- 4\n");
    							printf("\nVerwaltung verlassen	- 0\n\n");
    							printf("Eingabe : ");
    							scanf("%i", &eingabe2);
    							getchar();
    							printf("\n\n");
    							switch(eingabe2) {
    								case 1 : ListInput(liste); break;
    								case 2 : DelOne(liste); break;
    								case 3 : ListShow(liste); break;
    								case 4 : ListKontostand(liste); break;
    								case 0 : break;
    								default : printf("Fehlerhafte Eingabe, bitte korrigieren.\n"); break;
    							}
    						}while(eingabe2);
    						system("cls");
    					break;
    				case 5 : ListKonto(liste); break;
    				case 6 : PrintHelp();
    				case 0 : break;
    				default : printf("Fehlerhafte Eingabe, bitte korrigieren.\n"); break;
    			}
    		}while(eingabe);
    		ListDelAll(liste);
    	}
    }
    


  • wo stürtzt es ab im fread oder im listappend

    Oftmals hilft SteinzeitDebugging füge ein paar printf statements ein an denn du feststellen lanst an welcher Stelle im Programm du bist wie die dortigen Variablen aussehn.

    Bei die bíeten sich zwei bereich an eimal Konto_lesen und listappend.

    Wenn du einem moderen Compiler hast kannst du dafür auch excellent den eingebauten debugger nutzen um dir dieses Variablen anzuschauen wie pointer initialisiert sind ob eine Allokierung ok ist



  • Wie gesagt, das is die 5-6 Version der Laden funktion und es will nicht ;/

    Bin schon bis auf die Knochen an den Fingern..



  • Wer Speicher allokiert ohn den Erfolg zu prüfen gehört ...

    Macht denn der Inhalt von listhead nach dem fread Sinn?

    struct Knot *cur=malloc (sizeof(struct Knot));
    struct Knot *anf=hd->head;
    struct Knot *end=hd->tail;

    wo ist das malloc für struct Buchung *buch;



  • wie ich bereits sagte.. is das die 5-6 Version.. und momentan stehe ich vor der funktion wie der bauer vor der scheune..

    Es stürtz ab nachdem fread, das listappend läuft prima, da es bereits für die normale eingabe benutz wird.



  • Nach welchem der beiden freads listhead oder buch

    Ich tippe auf buch da das malloc für struct Buchung *buch fehlt


Anmelden zum Antworten