Frage zu fread/fwrite (Anfänger)
Verfasst: Di Dez 01, 2009 2:24 pm
Hallöle,
ich verzweifel gerade ein bischen an folgendem Code:
So lange ich nicht versuche, die in der Datei gespeicherten Daten nach einem Programmende und neuem Aufruf wieder einzulesen (Funktion 12) funktioniert (zumindest scheinbar) alles. Ich habe jetzt schon mehrere Stunden Foren/Tutorials gelesen. Aber ich komme da echt nicht weiter.
Bin für jede Hilfe dankbar.
Rappel
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