Jetzt läuft es, hier noch mal der (leicht modifizierte) Code.
Vielen Dank noch mal für die Hinweise und Hilfe.
Ist schon ganz schön viel Code, wenn man bedenkt, wie wenig das Ding kann.
rappel

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);
}
int DatenSpeichern (const char DATEINAME[], struct Kundendaten *k, int *datenGesetzt)
{
int i = 0;
FILE *dateizeiger;
/* Versuchen, die Datei mit r+ zum Lesen und Schreiben zu oeffnen */
dateizeiger = fopen (DATEINAME, "r+b");
if (dateizeiger == NULL) /* dann zum Schreiben oeffnen (neu anlegen) */
{
dateizeiger = fopen (DATEINAME, "w+b");
if (dateizeiger == NULL)
{
fputs ("Fehler: Datei konnte nicht geoeffnet werden!\n", stderr);
return EXIT_FAILURE;
}
}
printf ("\nDaten werden gespeichert.\n\n");
// fseek (dateizeiger, 0, SEEK_SET);
while ( 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);
fclose (dateizeiger);
}
int Datenlesen (const char DATEINAME[], struct Kundendaten *k, int *datenGesetzt)
{
int i = 0, ret;
FILE *dateizeiger;
/* Versuchen, die Datei mit r+ zum Lesen und Schreiben zu oeffnen */
dateizeiger = fopen (DATEINAME, "r+b");
if (dateizeiger == NULL)
{
fputs ("Fehler: Datei konnte nicht geoeffnet werden!\n", stderr);
return EXIT_FAILURE;
}
printf ("\nDaten werden gelesen.\n\n");
// fseek (dateizeiger, 0, SEEK_SET);
while ( ret = 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 */
//printf ("Rueckgabewert: %d\n",ret);
printf ("%d Datensaetze gelesen!\n", i);
fclose (dateizeiger);
}
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);
do
{
printf ("Welchen Eintrag verwenden: (1-10; 0 = Programmende; 11 = Speichern; 12 = Einlesen ; 13 = Zeige Datengesetzt) ");
scanf ("%u", &eingabe);
if (eingabe == 0)
{
return 0; /* Programmende */
}
else if (eingabe == 11)
{
DatenSpeichern (DATEINAME, kunden, datenGesetzt);
continue;
}
else if (eingabe == 12)
{
Datenlesen (DATEINAME, 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 */
return 0;
}