Shop in C - Nutzer Datei schreiben und auslesen

Sgorzman

Grünschnabel
Hallo. Und zwar muss ich fürs Studium ein Warenhaus in C programmieren. Ist vom Grunde her eigentlich auch alles kein Problem, ABER: Es soll möglich sein neue Nutzer anzulegen und diese in einer Datei zu speichern.
Folgende Daten sollen gespeichert werden:
- Name
- Vorname
- Strasse
- Hausnummer
- PLZ
- Ort
- Vorwahl
- Telefon

Hierbei ist mir folgendes klar:
- Name, Vorname, Strasse und Ort sind mit fgets zwecks leerzeichen einzulesen
- PLZ, Vorwahl und Telefon ist alles möglich als long bzw. integer zu speichern
Die frage die dabei bleibt ist: Was machen wir mit der Hausnummer, denn es könnte ja z.B. 7 b sein.

Aber mein eigentliches Problem liegt eigfentlich darin wie ich die datei wieder so auslese das alle Daten dort in der Struktur ankommen wo sie hingehören.
ich habe hier mal das was ich bis jetzt dazu habe. Würde mich freuen wenn mir schnell jemand helfen könnte.

C-Code:
Code:
#define MAX 40 

struct benutzer { 
        char name[MAX]; 
        char vorname[MAX]; 
        char strasse[MAX]; 
        /*int nr; 
        char buchstabe; 
        long plz; 
        char ort[MAX]; 
        char vorwahl[MAX]; 
        char telefon[MAX]; 
        char zusatz1_vor[MAX]; 
        char zusatz1_tel[MAX];*/ 
        struct benutzer *next; 

}; 

struct benutzer *next   = NULL; 
struct benutzer *anfang = NULL; 


void anhaengen(char *nach, char *vor, char *str) { 
   struct benutzer *zeiger; 

   if(anfang == NULL) { 
      if((anfang = (struct benutzer *) 
       malloc(sizeof(struct benutzer))) == NULL) { 
         fprintf(stderr, "Kein Speicherplatz vorhanden " 
                         "für anfang\n"); 
         return; 
      } 
      strcpy(anfang->name, nach); 
      strcpy(anfang->vorname, vor); 
      strcpy(anfang->strasse, str); 
     /*  anfang->nr = num; 
     anfang->buchstabe=buch; 
      anfang->plz = post; 
      strcpy(anfang->ort, stadt); 
      strcpy(anfang->vorwahl, vwahl); 
      strcpy(anfang->telefon, tel);*/ 
      anfang->next=NULL; 
   } 
    
   else { 
      zeiger=anfang; /* Wir zeigen auf das 1. Element */ 
      while(zeiger->next != NULL) 
         zeiger=zeiger->next; 
      
      if((zeiger->next =(struct benutzer *) 
       malloc(sizeof(struct benutzer))) == NULL) { 
          fprintf(stderr,"Kein Speicherplatz für das " 
                         "letzte Element\n"); 
          return; 
      } 
      zeiger=zeiger->next; /* zeiger auf neuen Speicherplatz */ 
      strcpy(zeiger->name, nach); 
      strcpy(zeiger->vorname, vor); 
      strcpy(zeiger->strasse, str); 
      /* zeiger->nr = num; 
      zeiger->buchstabe=buch; 
      zeiger->plz = post; 
      strcpy(zeiger->ort, stadt); 
      strcpy(zeiger->vorwahl, vwahl); 
      strcpy(zeiger->telefon, tel);*/ 
      zeiger->next=NULL; 
   } 
} 


void eingabe(void) { 
   char nam[MAX],vorn[MAX],strasse[MAX],ort[MAX],vorw[MAX],tel[MAX],buchst; 
   int nr,buchst_j_n; 
   long plz; 
   clrscr(); 
   printf("\nEingabe eines neuen Nutzers\n--------------------------------\n\n"); 
   fflush(stdin); 
   printf("Name........................: "); 
   //scanf("%s",&nam); 
   fgets(nam, MAX, stdin); 

   fflush(stdin); 
   printf("Vorname.....................: "); 
   //scanf("%s",&vorn); 
   fgets(vorn, MAX, stdin); 

   fflush(stdin); 
   printf("Strasse (ohne Nummer).......: "); 
   //scanf("%s",&strasse); 
   fgets(strasse, MAX, stdin); 

  /* do 
   { 
    fflush(stdin); 
    printf("Hausnummer (ohne Buchstabe): "); 
    scanf("%d",&nr); 
   }while((nr<1)|(nr>1000));*/ 
   nam[strlen(nam)-1]=""; 
   vorn[strlen(vorn)-1]=""; 
   strasse[strlen(strasse)-1]=""; 
   anhaengen(nam, vorn, strasse); 

   fflush(stdin); 
   printf("\n\nDaten gespeichert. Weiter mit [ENTER]"); 
   getchar(); 
} 

void speichern(void) { 
   struct benutzer *zeiger = anfang; 
   FILE *datei; 
   datei = fopen("benutzer.db", "w"); 
   while(zeiger != NULL) { 
       fprintf(datei,"%s %s %s %d\n", 
         zeiger->name,zeiger->vorname,zeiger->strasse); 
         zeiger=zeiger->next; 
   } 
   fclose(datei); 
} 

void dat_einlesen(void) 
{ 
   char nam[MAX],vorn[MAX],strasse[MAX],ort[MAX],vorw[MAX],tel[MAX],buchst; 
   int nr; 
   long plz; 
   FILE *datei; 

   datei = fopen("benutzer.db", "r"); 
   if(datei != NULL){ 
    while(!feof(datei)){ 
        fflush(stdin); 
        fgets(nam, MAX, datei); 
        fgets(vorn, MAX, datei); 
        fgets(strasse, MAX, datei); 
        //fgets(nr,MAX,datei); 

        anhaengen(nam, vorn, strasse); 
    } 
   } 
   /*else{ 
    printf("Fehler beim Öffnen der Datei"); 
   }*/ 

   fclose(datei); 
    
} 

void ausgabe(void) { 
   struct benutzer *zeiger = anfang; 
   while(zeiger != NULL) { 
      printf("%s %s %s %d\n", 
         zeiger->name,zeiger->vorname,zeiger->strasse); 
         zeiger=zeiger->next; 
   } 
   printf("\n"); 
}  
C/C++ Code: 
#define MAX 40 

struct benutzer { 
char name[MAX]; 
char vorname[MAX]; 
char strasse[MAX]; 
/*int nr; 
char buchstabe; 
long plz; 
char ort[MAX]; 
char vorwahl[MAX]; 
char telefon[MAX]; 
char zusatz1_vor[MAX]; 
char zusatz1_tel[MAX];*/ 
struct benutzer *next; 

}; 

struct benutzer *next = NULL; 
struct benutzer *anfang = NULL; 


void anhaengen(char *nach, char *vor, char *str) { 
struct benutzer *zeiger; 

if(anfang == NULL) { 
if((anfang = (struct benutzer *) 
malloc(sizeof(struct benutzer))) == NULL) { 
fprintf(stderr, "Kein Speicherplatz vorhanden " 
"für anfang\n"); 
return; 
} 
strcpy(anfang->name, nach); 
strcpy(anfang->vorname, vor); 
strcpy(anfang->strasse, str); 
/* anfang->nr = num; 
anfang->buchstabe=buch; 
anfang->plz = post; 
strcpy(anfang->ort, stadt); 
strcpy(anfang->vorwahl, vwahl); 
strcpy(anfang->telefon, tel);*/ 
anfang->next=NULL; 
} 

else { 
zeiger=anfang; /* Wir zeigen auf das 1. Element */ 
while(zeiger->next != NULL) 
zeiger=zeiger->next; 

if((zeiger->next =(struct benutzer *) 
malloc(sizeof(struct benutzer))) == NULL) { 
fprintf(stderr,"Kein Speicherplatz für das " 
"letzte Element\n"); 
return; 
} 
zeiger=zeiger->next; /* zeiger auf neuen Speicherplatz */ 
strcpy(zeiger->name, nach); 
strcpy(zeiger->vorname, vor); 
strcpy(zeiger->strasse, str); 
/* zeiger->nr = num; 
zeiger->buchstabe=buch; 
zeiger->plz = post; 
strcpy(zeiger->ort, stadt); 
strcpy(zeiger->vorwahl, vwahl); 
strcpy(zeiger->telefon, tel);*/ 
zeiger->next=NULL; 
} 
} 


void eingabe(void) { 
char nam[MAX],vorn[MAX],strasse[MAX],ort[MAX],vorw[MAX],tel[MAX],buchst; 
int nr,buchst_j_n; 
long plz; 
clrscr(); 
printf("\nEingabe eines neuen Nutzers\n--------------------------------\n\n"); 
fflush(stdin); 
printf("Name........................: "); 
//scanf("%s",&nam); 
fgets(nam, MAX, stdin); 

fflush(stdin); 
printf("Vorname.....................: "); 
//scanf("%s",&vorn); 
fgets(vorn, MAX, stdin); 

fflush(stdin); 
printf("Strasse (ohne Nummer).......: "); 
//scanf("%s",&strasse); 
fgets(strasse, MAX, stdin); 

/* do 
{ 
fflush(stdin); 
printf("Hausnummer (ohne Buchstabe): "); 
scanf("%d",&nr); 
}while((nr<1)|(nr>1000));*/ 
nam[strlen(nam)-1]=""; 
vorn[strlen(vorn)-1]=""; 
strasse[strlen(strasse)-1]=""; 
anhaengen(nam, vorn, strasse); 

fflush(stdin); 
printf("\n\nDaten gespeichert. Weiter mit [ENTER]"); 
getchar(); 
} 

void speichern(void) { 
struct benutzer *zeiger = anfang; 
FILE *datei; 
datei = fopen("benutzer.db", "w"); 
while(zeiger != NULL) { 
fprintf(datei,"%s %s %s %d\n", 
zeiger->name,zeiger->vorname,zeiger->strasse); 
zeiger=zeiger->next; 
} 
fclose(datei); 
} 

void dat_einlesen(void) 
{ 
char nam[MAX],vorn[MAX],strasse[MAX],ort[MAX],vorw[MAX],tel[MAX],buchst; 
int nr; 
long plz; 
FILE *datei; 

datei = fopen("benutzer.db", "r"); 
if(datei != NULL){ 
while(!feof(datei)){ 
fflush(stdin); 
fgets(nam, MAX, datei); 
fgets(vorn, MAX, datei); 
fgets(strasse, MAX, datei); 
//fgets(nr,MAX,datei); 

anhaengen(nam, vorn, strasse); 
} 
} 
/*else{ 
printf("Fehler beim Öffnen der Datei"); 
}*/ 

fclose(datei); 

} 

void ausgabe(void) { 
struct benutzer *zeiger = anfang; 
while(zeiger != NULL) { 
printf("%s %s %s %d\n", 
zeiger->name,zeiger->vorname,zeiger->strasse); 
zeiger=zeiger->next; 
} 
printf("\n"); 
}  
C/C++ Code: 
#define MAX 40 

struct benutzer { 
        char name[MAX]; 
        char vorname[MAX]; 
        char strasse[MAX]; 
        /*int nr; 
        char buchstabe; 
        long plz; 
        char ort[MAX]; 
        char vorwahl[MAX]; 
        char telefon[MAX]; 
        char zusatz1_vor[MAX]; 
        char zusatz1_tel[MAX];*/ 
        struct benutzer *next; 

}; 

struct benutzer *next   = NULL; 
struct benutzer *anfang = NULL; 


void anhaengen(char *nach, char *vor, char *str) { 
   struct benutzer *zeiger; 

   if(anfang == NULL) { 
      if((anfang = (struct benutzer *) 
       malloc(sizeof(struct benutzer))) == NULL) { 
         fprintf(stderr, "Kein Speicherplatz vorhanden " 
                         "für anfang\n"); 
         return; 
      } 
      strcpy(anfang->name, nach); 
      strcpy(anfang->vorname, vor); 
      strcpy(anfang->strasse, str); 
     /*  anfang->nr = num; 
     anfang->buchstabe=buch; 
      anfang->plz = post; 
      strcpy(anfang->ort, stadt); 
      strcpy(anfang->vorwahl, vwahl); 
      strcpy(anfang->telefon, tel);*/ 
      anfang->next=NULL; 
   } 
    
   else { 
      zeiger=anfang; /* Wir zeigen auf das 1. Element */ 
      while(zeiger->next != NULL) 
         zeiger=zeiger->next; 
      
      if((zeiger->next =(struct benutzer *) 
       malloc(sizeof(struct benutzer))) == NULL) { 
          fprintf(stderr,"Kein Speicherplatz für das " 
                         "letzte Element\n"); 
          return; 
      } 
      zeiger=zeiger->next; /* zeiger auf neuen Speicherplatz */ 
      strcpy(zeiger->name, nach); 
      strcpy(zeiger->vorname, vor); 
      strcpy(zeiger->strasse, str); 
      /* zeiger->nr = num; 
      zeiger->buchstabe=buch; 
      zeiger->plz = post; 
      strcpy(zeiger->ort, stadt); 
      strcpy(zeiger->vorwahl, vwahl); 
      strcpy(zeiger->telefon, tel);*/ 
      zeiger->next=NULL; 
   } 
} 


void eingabe(void) { 
   char nam[MAX],vorn[MAX],strasse[MAX],ort[MAX],vorw[MAX],tel[MAX],buchst; 
   int nr,buchst_j_n; 
   long plz; 
   clrscr(); 
   printf("\nEingabe eines neuen Nutzers\n--------------------------------\n\n"); 
   fflush(stdin); 
   printf("Name........................: "); 
   //scanf("%s",&nam); 
   fgets(nam, MAX, stdin); 

   fflush(stdin); 
   printf("Vorname.....................: "); 
   //scanf("%s",&vorn); 
   fgets(vorn, MAX, stdin); 

   fflush(stdin); 
   printf("Strasse (ohne Nummer).......: "); 
   //scanf("%s",&strasse); 
   fgets(strasse, MAX, stdin); 

  /* do 
   { 
    fflush(stdin); 
    printf("Hausnummer (ohne Buchstabe): "); 
    scanf("%d",&nr); 
   }while((nr<1)|(nr>1000));*/ 
   nam[strlen(nam)-1]=""; 
   vorn[strlen(vorn)-1]=""; 
   strasse[strlen(strasse)-1]=""; 
   anhaengen(nam, vorn, strasse); 

   fflush(stdin); 
   printf("\n\nDaten gespeichert. Weiter mit [ENTER]"); 
   getchar(); 
} 

void speichern(void) { 
   struct benutzer *zeiger = anfang; 
   FILE *datei; 
   datei = fopen("benutzer.db", "w"); 
   while(zeiger != NULL) { 
       fprintf(datei,"%s %s %s %d\n", 
         zeiger->name,zeiger->vorname,zeiger->strasse); 
         zeiger=zeiger->next; 
   } 
   fclose(datei); 
} 

void dat_einlesen(void) 
{ 
   char nam[MAX],vorn[MAX],strasse[MAX],ort[MAX],vorw[MAX],tel[MAX],buchst; 
   int nr; 
   long plz; 
   FILE *datei; 

   datei = fopen("benutzer.db", "r"); 
   if(datei != NULL){ 
    while(!feof(datei)){ 
        fflush(stdin); 
        fgets(nam, MAX, datei); 
        fgets(vorn, MAX, datei); 
        fgets(strasse, MAX, datei); 
        //fgets(nr,MAX,datei); 

        anhaengen(nam, vorn, strasse); 
    } 
   } 
   /*else{ 
    printf("Fehler beim Öffnen der Datei"); 
   }*/ 

   fclose(datei); 
    
} 

void ausgabe(void) { 
   struct benutzer *zeiger = anfang; 
   while(zeiger != NULL) { 
      printf("%s %s %s %d\n", 
         zeiger->name,zeiger->vorname,zeiger->strasse); 
         zeiger=zeiger->next; 
   } 
   printf("\n"); 
}


PS: Wem das jetzt zu schlecht erklärt ist kann sich mal unter http://www.htw-dresden.de/~wacker/SS05/WWW-Seite_PinC/pdf/Praktikum/Belegaufgabe.pdf die genaue Aufgabe anschauen um etwas dahinter zu blicken.

MfG
Tazz85
 
moin


Wie wäre es wenn du m,al die Boardsuche benutzt? Solche Themen gab es hier schon einige zwar ging es da meist nciht um Shops sondern um Telefonbücher, aber das kommt aufs selbe raus.


mfg
umbrasaxum
 
mmh also wie schön hier einen HTW-ler zu treffen - ich bin ja auch einer :))
und interessant zu erfahren das es eine neue Belegaufgabe gibt (bzw. eine die ich noch nicht kenne, bin ja kein Informatiker *g*)

also was dein problem betrifft: dein Quelltext sieht doch schon ganz gut aus.. funktioniert das etwa nicht ? (wieso hast du den eigentlich 3 mal eingefügt )

- für die Hausnumer würd ich einfach die Struktur erweitern um eine Variable (also die numer als Zahl und - falls es eine "Extension" gibt eine noch eine char Varibale dazu befüllen)

und wo was reingehört das muss du so sicherstellen das es immer auf die gleiche Art und Weise in der Datei steht (z.B. gleiche Reihenfolge)
Du kannst auch nen Plausibilitätstest mit rein machen der überprüft ob der name auch auch chars besteht, die nummer aus ner Zahl usw.
 
Zurück