/* blockweise                     Dateien                                    */
/*----------------------------------------------------------------------------*/
/*  Erzeugen Sie je eine Datei von Angestellten mit Namen und dazugehörigem
Einkommen, die
a) formatiert (mit fprintf und fscanf) und
b) blockweise (mit fwrite und fread) geschrieben wird.
Realisieren Sie folgende Änderung: Herr Meier bekommt 500,-DM mehr!
Vergleichen Sie die Handhabung und den benötigten Speicherplatz beider Dateien!
------------------------------------------------------------------------------*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

struct an_typ
{  char name[20];
   float gehalt;
};

int random( int a)
{  return (rand()%a);
}

main()
{  struct an_typ p;   FILE *f, *b;      int k, sf=0, sb=0;

   f= fopen("s:\\format.dat", "a+");  /* Testdatei */
   b= fopen("s:\\block.dat", "a+");   /* binäre Datei */

   printf("\n neuer Name: "); scanf("%s", &p.name);  p.gehalt=random(2000)+2000;

   fprintf( f,   "%s %f ", p.name, p.gehalt);           //f-formatiert schreiben
   fwrite ( &p, sizeof(p), 1     , b);                  //b-blockweise schreiben

   fclose(f);   f= fopen("s:\\format.dat", "r+");
   fclose(b);   b= fopen( "s:\\block.dat", "r+");
                                               printf("\n\n formatiert lesen:");
   while( fscanf( f, "%s %f ", &p.name, &p.gehalt)==2)
   {  printf("\n%10s: %8.2f", p.name, p.gehalt);
      k= strcmp( p.name, "Meier");
      if(k == 0 && p.gehalt<4000 )
      {  p.gehalt+= 500;
         fseek( f, sf, 0);
         fprintf( f, "%s %f", p.name, p.gehalt);        //f-formatiert schreiben
         printf("\n%30s: %8.2f", p.name, p.gehalt);
         fseek( f, ftell(f), 0);
      }
      sf= ftell( f);
   }                                           printf("\n\n blockweise lesen:");
   while( fread( &p, sizeof(p), 1, b)== 1)
   {  printf("\n%10s: %8.2f", p.name, p.gehalt);
      k= strcmp( p.name, "Meier");
      if( k == 0 && p.gehalt<4000 )
      {  p.gehalt+= 500;
         fseek( b, sb, 0);       // zurücksetzen zur alten Position
         fwrite( &p, sizeof(p), 1, b);                  //b-blockweise schreiben
         printf("\n%30s: %8.2f", p.name, p.gehalt);
         fseek(b, ftell(b), 0);
      }
      sb=ftell(b);  // Position merken
   }
   fclose(f); fclose(b);

   printf("   "); system("Pause"); return 0;
} //----------------------------------------------------------------------------
