ich verzweifel gerade ein bischen an folgendem Code:
Code: Alles auswählen
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Kundendaten
{
int Kundennummer;
char Name[150];
char Adresse[200];
char Telefonnummer[15];
};
void loescheTastaturpuffer()
{
int c;
while( ((c = getchar()) != EOF) && (c != '\n') )
;
}
void setzeDatensatz (struct Kundendaten *k, int eingabe, int *datenGesetzt)
{
int sizeName = 0, sizeAdr = 0, sizeTel = 0; /* Groesse der Felder */
sizeName = sizeof (k->Name);
sizeAdr = sizeof (k->Adresse);
sizeTel = sizeof (k->Telefonnummer);
printf ("Setze Eintrag %d:\n\n", eingabe);
printf ("Kundennummer: ");
scanf ("%d", &k->Kundennummer);
loescheTastaturpuffer(); /* sonst bleibt \n im Buffer */
printf ("Name: ");
fgets (k->Name, sizeName-1, stdin);
printf ("Adresse: ");
fgets (k->Adresse, sizeAdr-1, stdin);
printf ("Telefonnummer: ");
fgets (k->Telefonnummer, sizeTel-1, stdin);
/* Null-Terminierung und \n entfernen */
// k->Name[strlen(k->Name)-1] = '\0';
// k->Adresse[strlen(k->Adresse)-1] = '\0';
// k->Telefonnummer[strlen(k->Telefonnummer)-1] = '\0';
*datenGesetzt = 1; /* daran wird erkannt, dass schon Daten eingegeben wurden */
}
void zeigeDatensatz (struct Kundendaten *k, int i)
{
printf ("Kundennummer: %d\n", k[i].Kundennummer);
printf ("Name: %s\n", k[i].Name);
printf ("Adresse: %s\n", k[i].Adresse);
printf ("Telefonnummer: %s\n\n", k[i].Telefonnummer);
}
void DatenSpeichern (FILE *dateizeiger, struct Kundendaten *k, int *datenGesetzt)
{
int i = 0;
printf ("\nDaten werden gespeichert.\n\n");
fseek (dateizeiger, 0, SEEK_SET);
while ( i < 10 && datenGesetzt[i] == 1 && fwrite ( &k[i], sizeof(struct Kundendaten), 1, dateizeiger) ==1 )
{
printf ("Datensatz %d geschrieben...\n", i);
zeigeDatensatz (k, i);
i++; /* in die Datei schreiben */
}
printf ("%d Elemente erfolgreich geschrieben!\n", i);
}
void Datenlesen (FILE *dateizeiger, struct Kundendaten *k, int *datenGesetzt)
{
int i = 0;
printf ("\nDaten werden gelesen.\n\n");
fseek (dateizeiger, 0, SEEK_SET);
while ( fread ( &k[i], sizeof(struct Kundendaten), 1, dateizeiger) ==1 )
{
printf ("Datensatz %d gelesen...\n", i);
// zeigeDatensatz (k, i);
if (&k[i].Kundennummer != 0)
datenGesetzt[i] = 1;
i++;
} /* aus der Datei lesen */
}
void zeigeDatengesetzt (struct Kundendaten *k, int *datenGesetzt)
{
int j;
for (j = 0 ; j < 10; j++)
{
printf ("datenGesetzt [%d]: %d \n", j, datenGesetzt[j]);
//zeigeDatensatz (k, j);
}
}
void initall (struct Kundendaten *k)
{
int i;
for (i=0; i<10; i++)
{
k[i].Kundennummer = 0;
k[i].Name[0] = '\0';
k[i].Adresse[0] = '\0';
k[i].Telefonnummer[0] = '\0';
}
}
int main()
{
struct Kundendaten kunden[10];
unsigned int eingabe = 0;
int i = 0, j,
datenGesetzt[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
FILE *dateizeiger;
const char DATEINAME[] = "testoutput.dat";
initall (kunden);
/* Versuchen, die Datei mit r+ zum Lesen und Schreiben zu oeffnen */
dateizeiger = fopen (DATEINAME, "r+");
if (dateizeiger == NULL) /* dann zum Schreiben oeffnen (neu anlegen) */
{
dateizeiger = fopen (DATEINAME, "w");
if (dateizeiger == NULL)
{
fputs ("Fehler: Datei konnte nicht geoeffnet werden!\n", stderr);
return EXIT_FAILURE;
}
}
do
{
printf ("Welchen Eintrag verwenden: (1-10; 0 = Programmende; 11 = Speichern; 12 = Einlesen ; 13 = Zeige Datengesetzt) ");
scanf ("%u", &eingabe);
if (eingabe == 0)
{
fclose (dateizeiger);
return 0; /* Programmende */
}
else if (eingabe == 11)
{
DatenSpeichern (dateizeiger, kunden, datenGesetzt);
continue;
}
else if (eingabe == 12)
{
Datenlesen (dateizeiger, kunden, datenGesetzt);
continue;
}
else if (eingabe == 13)
{
zeigeDatengesetzt (kunden, datenGesetzt);
continue;
}
else if (eingabe > 10)
continue; /* sonst wird der zulaessige Bereich ueberschritten */
i = eingabe -1; /* Array-Index geht von 0 bis 9, Benutzereingabe aber von 1 bis 10 */
/* wenn noch keine Daten eingegeben wurden, einlesen */
if (datenGesetzt[i] == 0) /* false */
setzeDatensatz (&kunden[i], eingabe, &datenGesetzt[i]);
else /* true */
{ /* sonst Daten anzeigen */
zeigeDatensatz (kunden, i);
}
}
while (1); /* Endlosschleife */
fclose (dateizeiger);
return 0;
}
Bin für jede Hilfe dankbar.
Rappel