Frage zu fread/fwrite (Anfänger)

Schnelle objektorientierte, kompilierende Programmiersprache.
rappel
Beiträge: 4
Registriert: Di Dez 01, 2009 2:13 pm

Re: Frage zu fread/fwrite (Anfänger)

Beitrag von rappel » Di Dez 01, 2009 7:40 pm

Also, ich denke, es war das das Öffnen und Schließen der Datei, zusammen mit dem richtigen Parameter und an der richtigen Stelle.

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 :mrgreen:

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;
}

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Frage zu fread/fwrite (Anfänger)

Beitrag von Xin » Di Dez 01, 2009 10:09 pm

Je mehr Du programmieren lernst, desto mehr wirst Du wiederverwendbare Programmteile schreiben.
Es wird damit nicht weniger Quelltext, aber beim zweiten Mal musst Du ihn ja nicht nochmals schreiben. ^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten