Daten in Array von Struktur laden (wie?)



  • Hallo!
    Ich brächte da Hilfe bei einer kleinen Sache.. Also ich habe ein Programm, dass mich Werte in ein Array einer Struktur eingeben lässt. Diese Werte speichere ich in einer Datei (das klappt so weit auch).. Nun möchte ich diese Werte auch wieder aus der Datei laden und in das Array schreiben, nur leider habe ich keine Ahnung, wie ich das machen soll!
    Hier der Quellcode:

    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    
    struct Wohnen
    {
    	char city[12];
    	unsigned short plz;
    };
    
    struct Alter
    {
    	short tag;
    	short monat;
    	short jahr;
    };
    
    struct Person
    {
    	char vname[20];
    	char nname[20];
    	struct Wohnen ort;
    	struct Alter geb;
    };
    
    int eingabe(struct Person**,short*);
    int ausgabe(struct Person*,short);
    int speichern(struct Person*,short);
    int laden(struct Person**,short*);
    int line_count(void);
    
    int main(void)
    {
    	struct Person *person;
    	short nInput=0x00,nSize=0x00;
    	FILE *datei=NULL;
    
    	do
    	{
    		system("cls");
    		printf("Personenverwaltung\n");
    		printf("==================\n\n");
    		printf("1.) Person(en) eingeben\n");
    		printf("2.) Personen ausgeben\n");
    		printf("3.) Daten sichern\n");
    		printf("Mit ESC beenden!\n\n");
    		printf("Auswahl: ");
    		nInput=getch();
    		printf("\n\n");
    		switch(nInput)
    		{
    		case 0x31:
    			{
    				eingabe(&person,&nSize);
    				break;
    			}
    		case 0x32:
    			{
    				ausgabe(person,nSize);
    				break;
    			}
    		case 0x33:
    			{
    				speichern(person,nSize);
    				break;
    			}
    		case 0x1B:
    			{
    				exit(1);
    			}
    		default:
    			{
    				printf("Fehlerhafte Eingabe!\n<ENTER>");
    				getchar();
    			}
    		}
    	}while(1);
    
    	return 0;
    }
    
    int eingabe(struct Person **struktur,short *nSize)
    {
    	short i;
    
    	printf("Wie viele Personen eingeben: ");
    	scanf("%10d",nSize);
    	*struktur=(struct Person*)malloc((*nSize)*sizeof(struct Person));
    
    	for(i=0x00;i<(*nSize);i++)
    	{
    		printf("Daten fuer %i. Person eingeben\n",i+1);
    		printf("Vorname: ");
    		scanf("%20s",struktur[i]->vname);
    
    		printf("Nachname: ");
    		scanf("%20s",struktur[i]->nname);
    
    		printf("PLZ: ");
    		scanf("%7d",&struktur[i]->ort.plz);
    
    		printf("Ort: ");
    		scanf("%14s",struktur[i]->ort.city);
    		printf("Geburtstag: ");
    		scanf("%2d.%2d.%4d",&struktur[i]->geb.tag,&struktur[i]->geb.monat,&struktur[i]->geb.jahr);
    	}
    	return 0;
    }
    
    int ausgabe(struct Person *struktur,short nSize)
    {
    	short i;
    
    	for(i=0x00;i<nSize;i++)
    	{
    		printf("Daten fuer %i. Person eingeben\n",i+1);
    		printf("Vorname: %s\n",struktur[i].vname);
    		printf("Nachname: %s\n",struktur[i].nname);
    		printf("PLZ: %d\n",struktur[i].ort.plz);
    		printf("Ort: %s\n",struktur[i].ort.city);
    		printf("Geburtstag: %d.%d.%d",struktur[i].geb.tag,struktur[i].geb.monat,struktur[i].geb.jahr);
    	}
    	fflush(stdin);
    	getchar();
    	return 0;
    }
    
    int speichern(struct Person *struktur,short nSize)
    {
    	short i;
    	FILE *datei=NULL;
    
    	datei=fopen("liste.dat","w+");
    	if(datei==NULL)
    	{
    		fprintf(stderr,"Fehler!");
    		getchar();
    	}
    	else
    		for(i=0x00;i<nSize;i++)
    			fprintf(datei,"%s;%s;%d;%s;%d;%d;%d\n",struktur[i].nname,struktur[i].vname,struktur[i].ort.plz,struktur[i].ort.city,struktur[i].geb.tag,struktur[i].geb.monat,struktur[i].geb.jahr);
    	return 0;
    }
    
    int laden(struct Person **struktur,short *nSize)
    {
    	FILE *datei=NULL;
    	short i=0x00;
    	char nTmp;
    
    	*nSize=line_count();
    	*struktur=(struct Person*)malloc((*nSize)*sizeof(struct Person));
    
    	datei=fopen("liste.dat","r");
    	if(datei==NULL)
    	{
    		fprintf(stderr,"Fehler!");
    		getchar();
    	}
    	else
    	{
    		// Großes Fragezeichen...!!!
    	}
    	return 0;
    }
    
    // Ermittelt die Anzahl der Zeilen in einer Datei
    // also anzahl der Personen
    int line_count(void)
    {
    	int tempvar, i=0;
    	FILE *fp=NULL;
    
    	fp=fopen("liste.dat","r");
    	if(fp==NULL)
    	{
    		fprintf(stderr,"Fehler!");
    		getchar();
    		exit(1);
    	}
    	tempvar=fgetc(fp);
    	while(!feof(fp))
    	{
    		if(tempvar==10)
    			i++;
    		tempvar=fgetc(fp); 
    	}
        fclose(fp);
    	return i-1;
    }
    

    Wäre sehr dankbar, wenn mir jemand helfen könnte...
    MFG
    Georg



  • geht genau umgekehrt zum schreiben...
    so lange der filepointer nicht auf eof zeigt also while(!feof(*fp))... lies ein struct ein un baller es in die liste/array



  • Wie schon beschrieben, geht das Laden genauso wie das schreiben, nur dass du hald eine andere Funktion brauchst 😉 -> fscanf().

    Allgemein gibts noch Verbesserungswürdiges in deinem Code. Wenn du eh schon die conio.h verwendest, dann nimm bitte clrscr() zum Löschen des Bildschirms her und niemals nicht system("CLS"). system() sollte man nur verwenden, wenn es nicht anders geht und das ist wirklich sehr sehr selten.

    Dann ist da noch dein switch(). Verwende am besten keine Zahlen bei deinen case sondern die Zahlen bzw. Buchstaben in Literalen. Also nicht 0x31 wie bei dir sondern '1'. Das fördert sehr die Lesbarkeit deines Codes. Du wirst es dir irgendwann einmal selber danken ;). Und wenn Programmieren dein Job ist oder einmal werden wird, dann werden es dir auch andere danken und du selber wirst wohl auch froh sein, wenn es jemand so macht.



  • Hallo!
    Ok, war wohl gestern Abend etwas beschränkt... Das mit fscanf hätte mir eigentlich auch einfallen können 🙂
    Zu system: ich benutze vc++ 6 und irgendwie ist dem Compiler clrscr() nicht bekannt. Ich weiß, das system("cls") keine besonders schöne lösung ist, aber was soll man machen 😉 Das mit den Zahlen werde ich mir zu Herzen nehmen, könntest du Recht haben! 🙂
    vielen dank für die tipps!



  • Georg` schrieb:

    ... Ich weiß, das system("cls") keine besonders schöne lösung ist, aber was soll man machen 😉 ...

    Am besten in die Konsolen-FAQ schauen unter Improved Console. Da gibts eine Lösung, die auch für den VC++ gibt ;).



  • könnte mal jemand n beispiel posten, wie das fertig aussehen würde?! ich versteh's net


Anmelden zum Antworten