/*                          Dateien
 Ein Arzt habe folgende Informationen über jeden Patienten: Name, Geburtsjahr
und Gewicht(in kg).
Schreiben Sie ein Programm, das einen neuen Patienten in die Datei einträgt,
alle Daten anzeigt und den leichtesten Patienten ausgibt.
------------------------------------------------------------------------------*/
#include <stdio.h>
struct patient
{   char name[20]; int jahr; float gew;
};
void schreiben( char dateiname[])
{  struct patient p;                      /* passende lokale Strukturvariable */
   FILE* datei;                    /* Zeiger auf Dateisteuerblock vereinbaren */
   datei= fopen( dateiname, "a");                /* Datei zum Anhängen öffnen */
   if( datei== NULL) printf("\n %s konnte nicht geoeffnet werden!\n",dateiname);
   else
   {   printf("\n Name: ");      scanf("%s", p.name);       /* Daten einlesen */
       printf(" Geburtsjahr: "); scanf("%i", &p.jahr);
       printf(" Gewicht: ");     scanf("%f", &p.gew);
       fprintf( datei, "%s %i %f ", p.name, p.jahr, p.gew);
       fclose( datei);                                     /* Datei schließen */
   }
}
void lesen( char dateiname[])
{  struct patient p;
   FILE* f;
   f= fopen( dateiname, "r");                       /* Datei zum Lesen öffnen */
   if( f== NULL) printf("\n %s konnte nicht geoeffnet werden!\n",dateiname);
   else
   { while( fscanf( f, "%s %i %f ", p.name, &p.jahr, &p.gew)== 3)
                      printf("\n %-10s | %20i | %20.3f", p.name, p.jahr, p.gew);
                         /* Lesen und Anzeigen, solange Daten gefunden werden */
     fclose( f);
   }
}
void aendern( char aname[])
{  char bname[15];
   printf("\n zzT.: %s, neuer Dateiname mit Pfad: ", aname);
   scanf("%s", bname);                /* alten Namen anzeigen, neuen einlesen */
   rename( aname, bname);                                /* Datei umbenennen  */
}
void gewicht( char aname[])              /* Gewicht aendern m.H. einer 2.Datei*/
                                         /* Prinzip ginge auch für's Löschen */
{  struct patient p, such;   char bname[]="s:/hilf.dat";   int k;
   FILE* a, *hilf;
   printf("\n gesuchter Name: "); scanf("%s", such.name);
   printf("\n neues Gewicht: ");  scanf("%f", &such.gew);
   a= fopen( aname, "r");           /* beide Dateien öffnen, eine ztum Lesen, */
   hilf= fopen( bname, "w");                      /* die andere zum Schreiben */
   if( a== NULL) printf("\n %s konnte nicht geoeffnet werden!\n",aname);
   else
   if( hilf== NULL) printf("\n %s konnte nicht geoeffnet werden!\n",bname);
   else
   { while( fscanf( a, "%s %i %f ", p.name, &p.jahr, &p.gew)== 3)    /* lesen */
      {  printf("\n %-10s | %20i | %20.3f", p.name, p.jahr, p.gew); /* zeigen */
         k= strcmp( p.name, such.name);                  /* Namen vergleichen */
         if( k==0) { p.gew=such.gew;   printf("  neues Gewicht: %.1f\n", p.gew);
                   } /* bei gleichem Namen, Gewicht in der Variablen ändern */
         fprintf( hilf, "%s %i %f ", p.name, p.jahr, p.gew);
      }                               /* Struktur in die neue Datei schreiben */
      fclose( a);                                       /* Dateiens schließen */
      fclose( hilf);
      remove( aname);                                   /* alte Datei löschen */
      rename( bname, aname);                /* neue Datei bekommt alten Namen */
   }
}
void gew_seek( char aname[])                   /* Gewicht ändern ohne 2.Datei */
                                     /* geht nur bei gleicher Länge der Daten */
{  struct patient p, such;       int k, ft=0;
   FILE * a;
   printf("\n gesuchter Name: "); scanf("%s", such.name);
   printf("\n neues Gewicht: ");  scanf("%f", &such.gew);
   a= fopen( aname, "r+");                /* Datei zum Lesen+Schreiben öffnen */
   if( a== NULL) printf("\n %s konnte nicht geoeffnet werden!\n", aname);
   else
   {  ft= ftell( a);printf("  ft=%i  ", ft);      /* aktuelle Position merken */
      while( fscanf( a, "%s %i %f ", p.name, &p.jahr, &p.gew)== 3)  /* lesen */
      {  printf("\n %-10s | %20i | %20.3f", p.name, p.jahr, p.gew); /* zeigen */
         k= strcmp( p.name, such.name);                  /* Namen vergleichen */
         if( k==0){  p.gew=such.gew;   printf("  neues Gewicht: %.1f\n", p.gew);
                       /* bei gleichem Namen, Gewicht in der Variablen ändern */
                     fseek( a, ft, 0);   printf("  seeek=%i  ", ft);
                                            /* auf alte Position zurücksetzen */
                     fprintf( a, "%s %i %f ", p.name, p.jahr, p.gew);
                                               /* alte Struktur überschreiben */
                     break;         /* nicht weiter Lesen, weil Name gefunden */
                  }
         ft= ftell( a); printf("  ft=%i  ", ft); /* aktuelle Position merken */
      }
      fclose( a);                                          /* Datei schließen */
   }
}
void andere( char aname[])
 { char bname[15];
   printf("\n zzT.: %s,  anderer Dateiname mit Pfad: ", aname);
   scanf("%s", bname);
   strcpy(aname, bname);    /* den neuen Namen auf die alte Variable kopieren */
}
int main()
{  int menue;  char aname[]="s:/neu.dat";
   do
   {  printf("\n\n Menue: 0-Ende\n\t1-Einlesen\n\t2-Tabelle\n\t3-D-Namen aend"
      "ern\n\t4-andere Datei\n\t5-Gewicht aendern\n\t6-seek\t\tgewaehlt: ");
      scanf("%i", &menue);
      switch( menue)
      {  case 1: schreiben( aname); break;
         case 2: lesen    ( aname); break;
         case 3: aendern  ( aname); break;
         case 4: andere   ( aname); break;
         case 5: gewicht  ( aname); break;
         case 6: gew_seek ( aname);
      }
   }while( menue!=0);


   return 0;
}
