Kundentabelle erstellen
-
Hallo zusammen,
ich habe mir aus einem Buch folgendes Programm abgeleitet.Ich habe leider noch ein paar Fehler drinne und weis nicht genau woran es liegt. Das Programm soll neue Kunden anlegen und in eine Datei schreiben, aus Datei auslese.
Wäre nett von euch wenn mir einer sagen kann was ich falsch gemacht habe.Die Fehler sind in Zeile: 72,109,115 und 124.
Ich benutze den Kompiler Bloodshed DEV-C++.
DAnke schon mal im Voraus!# include <stdio.h> # include <stdlib.h> # include <string.h> #define NAMLEN 20 /*Maximale Laenge des Namens*/ #define ANZAHL 10 /*Maximale Anzahl Kunden*/ #define NEU 1 /*Zahl für Swich-Case Anweisung*/ #define AUSGABE 2 /*Zahl für Swich-Case Anweisung*/ #define EINGABE 3 /*Zahl für Swich-Case Anweisung*/ #define ENDE 4 /*Zahl für Swich-Case Anweisung*/ #define FILNAM "KUNDENTABELLE.dat short lesen (struct Kunden *kunde, short len); short menue (void); void neu (void); short eingabe (struct Kunden *kunde, short anzahl, short len); void ausgabe (struct Kunden *kunde); struct Kunden/*Structuren*/ { char name[NAMLEN]; /*Name vom neuen Kunden*/ char vorname; /*Vorname neuer Kunde*/ char strasse; /*Strasse neuer Kunde*/ long postleitzahl; /*Postleizahl neuer Kunde*/ char stadt; /*Stadt neuer Kunde*/ }; int main (void)/*Hauptprogramm*/ { struct Kunden Kunden_vek[ANZAHL+1]; /*Array der Kundenstructuren*/ struct Kunden *pt; /*Zeiger für Kunden*/ short anzahl; /*Anzahl Kunden*/ short wahl; /*Menue Auswahl*/ /*Datei Lesen*/ anzahl = lesen (Kunden_vek, ANZAHL); for(;;) { wahl = menue(); /*Menue Darstellen*/ switch (wahl) { case NEU: printf("\n** Neue Datei anlegen\n"); /*Datei neu anlegen*/ neu(); anzahl=0; Kunden_vek[0].postleitzahl=-1; break; case EINGABE: printf("\n** Daten eingeben\n"); /*Dateieingabe*/ anzahl=eingabe (Kunden_vek,anzahl,ANZAHL); Kunden_vek[0].postleitzahl=-1; break; case AUSGABE: printf("\n*** Daten ausgeben\n\n"); /*Dateiausgabe auf Bildschirm*/ for (pt=Kunden_vek;pt->postleitzahl!=-1;pt++) ausgabe(pt); break; case ENDE: printf("\n*** Programmende\n"); return 0; }/*switch*/ }/*for*/ }/*Main*/ short int lesen (struct Kunden *kunde, short len)/*Daten aus Datei lesen*/ { FILE *pfile; short index; short anzahl; pfile = fopen (FILNAM,"r"); /*Datei zum lesen öffnen*/ if (!pfile) { kunde[0].postleitzahl=-1; return(0); } for (index=0; index<len; index++) /*Daten aus Datei lesen*/ { anzahl = fscanf(pfile,"%s",kunde[index].name); if(anzahl==EOF) break; fscanf(pfile,"%g %d %d %c", &kunde[index].vorname, &kunde[index].strasse, &kunde[index].postleitzahl, &kunde[index].stadt); } fclose(pfile); /*DAtei schliesen*/ kunde[index].postleitzahl=-1; return(index); } short menue()/*Menueabfragen und Auswahl*/ { short wahl; printf("\nPKW-Programm\n\n"); printf("%d- Neue Datei anlegen\n",NEU); printf("%d- Ausgabe der Dateien\n",AUSGABE); printf("%d- Eingabe weiterer Daten\n",EINGABE); printf("%d- Programmende\n",ENDE); printf("\nWählen Sie eine Zahl:"); scanf("%d",&wahl); return(wahl); } void neu()/*neue Datei anlegen*/ { FILE *pfile; pfile = fopen(FILNAM,"w"); fclose(pfile); } short eingabe (struct Kunden *kunde, short anzahl, short len)/*Eingabe der daten in das Array *kunde */ { FILE *pfile; short index; pfile = fopen (FILNAM,"a"); if (!pfile) { printf("Zugriffsfehler!\n");return(anzahl); } for (index=anzahl; index<len; index++)/*Dateneingabe mit gleichzeitigem Speichern*/ { printf("Kunden-Name:\n"); scanf("%s",kunde[index].name); if(wagen[index].name[0]=='*')break; printf("vorname strasse postleitzahl stadt:\n"); scanf("%g %d %d %c",&kunde[index].vorname, &kunde[index].stadt); fprintf(pfile,"%s\n",kunde[index].name); fprintf(pfile,"%g %d %d %c\n",kunde[index].vorname, kunde[index].strasse,kunde[index].postleitzahl,kunde[index].stadt); } fclose(pfile);/*Datei schließen*/ kunde[index].postleitzahl=-1;/*Rückgabe der Anzahl*/ return(index); } void ausgabe (struct Kunden* kunde)/*Ausgabe der Kundendaten*/ { printf("%s %g %d %d %c\n",NAMLEN,kunde->name,kunde->vorname,kunde->strasse,kunde->postleitzahl,kunde->stadt); }
-
Limemo schrieb:
Ich benutze den Kompiler Bloodshed DEV-C++.
Was ein halbwegs neuer gcc dazu sagt:
main.c:11:16: warning: missing terminating " character main.c:14: Warnung: »struct Kunden« innerhalb Parameterliste deklariert main.c:14: Warnung: sein Gültigkeitsbereich umfasst nur diese Definition bzw. Deklaration, was Sie wahrscheinlich nicht wollten main.c:17: Warnung: »struct Kunden« innerhalb Parameterliste deklariert main.c:18: Warnung: »struct Kunden« innerhalb Parameterliste deklariert main.c: In Funktion »main«: main.c:38: Warnung: Übergabe des Arguments 1 von »lesen« von inkompatiblem Zeigertyp main.c:52: Warnung: Übergabe des Arguments 1 von »eingabe« von inkompatiblem Zeigertyp main.c:58: Warnung: Übergabe des Arguments 1 von »ausgabe« von inkompatiblem Zeigertyp main.c: Auf höchster Ebene: main.c:67: Fehler: In Konflikt stehende Typen für »lesen« main.c:14: Fehler: Vorherige Deklaration von »lesen« war hier main.c: In Funktion »lesen«: main.c:72: Fehler: fehlendes abschließendes Zeichen " main.c:72: Fehler: expected expression before »,« token main.c:87: Warnung: format »%g« erwartet Typ »float *«, aber Argument 3 hat Typ »char *« main.c:87: Warnung: format »%d« erwartet Typ »int *«, aber Argument 4 hat Typ »char *« main.c:87: Warnung: format »%d« erwartet Typ »int *«, aber Argument 5 hat Typ »long int *« main.c: In Funktion »menue«: main.c:103: Warnung: format »%d« erwartet Typ »int *«, aber Argument 2 hat Typ »short int *« main.c: In Funktion »neu«: main.c:109: Fehler: fehlendes abschließendes Zeichen " main.c:109: Fehler: expected expression before »,« token main.c: Auf höchster Ebene: main.c:111: Fehler: In Konflikt stehende Typen für »eingabe« main.c:17: Fehler: Vorherige Deklaration von »eingabe« war hier main.c: In Funktion »eingabe«: main.c:115: Fehler: fehlendes abschließendes Zeichen " main.c:115: Fehler: expected expression before »,« token main.c:124: Fehler: »wagen« nicht deklariert (erste Benutzung in dieser Funktion) main.c:124: Fehler: (Jeder nicht deklarierte Bezeichner wird nur einmal aufgeführt main.c:124: Fehler: für jede Funktion in der er auftritt.) main.c:127: Warnung: format »%g« erwartet Typ »float *«, aber Argument 2 hat Typ »char *« main.c:127: Warnung: format »%d« erwartet Typ »int *«, aber Argument 3 hat Typ »char *« main.c:127: Warnung: zu wenig Argumente für Format main.c:130: Warnung: format »%g« erwartet Typ »double«, aber Argument 3 hat Typ »int« main.c:130: Warnung: format »%d« erwartet Typ »int«, aber Argument 5 hat Typ »long int« main.c: Auf höchster Ebene: main.c:138: Fehler: In Konflikt stehende Typen für »ausgabe« main.c:18: Fehler: Vorherige Deklaration von »ausgabe« war hier main.c: In Funktion »ausgabe«: main.c:140: Warnung: format »%s« erwartet Typ »char *«, aber Argument 2 hat Typ »int« main.c:140: Warnung: format »%g« erwartet Typ »double«, aber Argument 3 hat Typ »char *« main.c:140: Warnung: format »%c« erwartet Typ »int«, aber Argument 6 hat Typ »long int«
Manche Warnungen und Fehler kommen daher, dass du Dinge verwendest, bevor sie bekannt sind (zb die Struktur). Dagegen hilft umsortieren. Die Warnungen zu den Formatfunktionen solltest du ernstnehmen, und die Syntaxfehler rausnehmen, dann wird's schon gehen.
-
Und wenn dich die Makros verwirren, versuch mal statt Zeile 11:
char const * const FILNAM = "KUNDENTABELLE.dat;
-
zeile 72,109,115 beziehen sich auf den selben fehler: in zeile 11 fehlt das abschließende anführungszeichen.
in zeile 124 scheint die variable wagen nicht bekannt zu sein.
-
wollt da jetzt nicht ewig rum machen, aber evtl. kannst damit was anfangen...
# include <stdio.h> # include <stdlib.h> # include <string.h> #define NAMLEN 20 /*Maximale Laenge des Namens*/ #define ANZAHL 10 /*Maximale Anzahl Kunden*/ #define NEU 1 /*Zahl für Swich-Case Anweisung*/ #define AUSGABE 2 /*Zahl für Swich-Case Anweisung*/ #define EINGABE 3 /*Zahl für Swich-Case Anweisung*/ #define ENDE 4 /*Zahl für Swich-Case Anweisung*/ #define FILNAM "KUNDENTABELLE.dat" struct Kunden/*Structuren*/ { char name[NAMLEN]; /*Name vom neuen Kunden*/ char vorname[NAMLEN]; /*Vorname neuer Kunde*/ char strasse[NAMLEN]; /*Strasse neuer Kunde*/ char stadt[NAMLEN]; /*Stadt neuer Kunde*/ int postleitzahl; /*Postleizahl neuer Kunde*/ }; int lesen(struct Kunden *kunde, short len)/*Daten aus Datei lesen*/ { FILE *pfile; short index; short anzahl; pfile = fopen(FILNAM,"r"); /*Datei zum lesen öffnen*/ if (!pfile) { printf("error open file"); return 0; } for (index=0; index<len; index++) /*Daten aus Datei lesen*/ { anzahl = fscanf(pfile,"%s %s %d %s\n", kunde[index].vorname, kunde[index].strasse, &kunde[index].postleitzahl, kunde[index].stadt); if(anzahl==EOF) break; } fclose(pfile); /*DAtei schliesen*/ return index; } int menue()/*Menueabfragen und Auswahl*/ { int wahl; printf("\nPKW-Programm\n\n"); printf("%d- Neue Datei anlegen\n",NEU); printf("%d- Ausgabe der Dateien\n",AUSGABE); printf("%d- Eingabe weiterer Daten\n",EINGABE); printf("%d- Programmende\n",ENDE); printf("\nWählen Sie eine Zahl:"); scanf("%d",&wahl); return(wahl); } void neu()/*neue Datei anlegen*/ { FILE *pfile; pfile = fopen(FILNAM,"w"); fclose(pfile); } /*Eingabe der daten in das Array *kunde */ void eingabe(struct Kunden *kunde, short *anzahl, short len) { FILE *pfile; short index; pfile = fopen (FILNAM,"a"); if (!pfile){ printf("Zugriffsfehler!\n"); }else{ for (index=*anzahl; index<ANZAHL && len--; index++)/*Dateneingabe mit gleichzeitigem Speichern*/ { printf("vorname strasse postleitzahl stadt:\n"); scanf("%s %s %d %s", kunde[index].vorname, kunde[index].strasse, &kunde[index].postleitzahl, kunde[index].stadt); fprintf(pfile,"%s %s %d %s\n", kunde[index].vorname, kunde[index].strasse, kunde[index].postleitzahl, kunde[index].stadt); *anzahl += 1; } fclose(pfile); } } void ausgabe(struct Kunden* kunde) { printf("%s %s %d %s\n" ,kunde->vorname ,kunde->strasse ,kunde->postleitzahl ,kunde->stadt ); } int main (void)/*Hauptprogramm*/ { struct Kunden Kunden_vek[ANZAHL+1]; /*Array der Kundenstructuren*/ struct Kunden *pt; /*Zeiger für Kunden*/ short anzahl; /*Anzahl Kunden*/ short wahl; /*Menue Auswahl*/ short buffer; /*Datei Lesen*/ anzahl = lesen (Kunden_vek, ANZAHL); for(;;) { wahl = menue(); /*Menue Darstellen*/ switch (wahl) { case NEU: printf("\n** Neue Datei anlegen\n"); /*Datei neu anlegen*/ neu(); anzahl=0; break; case EINGABE: printf("\n** Daten eingeben\n"); /*Dateieingabe*/ eingabe(Kunden_vek,&anzahl,1); break; case AUSGABE: printf("\n*** Daten ausgeben\n\n"); /*Dateiausgabe auf Bildschirm*/ pt = Kunden_vek; buffer = anzahl; while(buffer--){ ausgabe(pt++); } break; case ENDE: printf("\n*** Programmende\n"); return 0; }/*switch*/ }/*for*/ }/*Main*/
lg lolo