#include <stdio.h>

struct Persoon {
   int sleutel;
   int leeg;
   char naam[80];
};

void voegtoe(void) {
   FILE* fp;
   struct Persoon p;
   int gevonden=0;
   fp=fopen("persoon.geg", "rb+");
   if (fp==NULL) {
      char antw;
      do {
	      printf("Kan persoon.geg niet vinden. Nieuw bestand openen? (J/N): ");
	      fflush(stdin);
      } while (scanf("%c", &antw)!=1 || antw!='J' && antw!='j' && antw!='N' && antw!='n');
      if (antw=='J' || antw=='j') {
         fp=fopen("persoon.geg", "wb+");
         if (fp==NULL) {
            printf("Error: Kan persoon.geg niet aanmaken.\n");
         }
      }
   }
   if (fp!=NULL) {
      p.sleutel=-1;
      while (gevonden==0 && fread(&p, sizeof p, 1, fp)==1) {
         if (p.leeg==1) {
            gevonden=1;
         }
      }
      if (gevonden==1) {
         fseek(fp, -1 * sizeof p, SEEK_CUR);
      }
      else {
         ++p.sleutel;
      }
      p.leeg=0;
      do {
	      printf("Geef naam voor persoon %d:\n", p.sleutel);
   	   fflush(stdin);
      } while(scanf("%79[ a-zA-Z]", p.naam)!=1);
      fwrite(&p, sizeof p, 1, fp);
      fclose(fp);
   }
}

void verwijder(void) {
   FILE* fp;
   fp=fopen("persoon.geg", "rb+");
   if (fp==NULL) {
      printf("Error: de file persoon.geg kan niet geopend worden.\n");
   }
   else {
      int sleutel;
      struct Persoon p;
      do {
      	printf("Geef nummer: ");
         fflush(stdin);
      }
      while(scanf("%d", &sleutel)!=1);
      fseek(fp, sleutel * sizeof p, SEEK_SET);
      if (fread(&p, sizeof p, 1, fp)!=1) {
         printf("Error: de persoon kan niet gevonden worden.\n");
      }
      else {
         if (p.leeg==1) {
            printf("Error: de persoon kan niet gevonden worden.\n");
         }
         else {
            p.leeg=1;
            fseek(fp, -1 * sizeof p, SEEK_CUR);
            if (fwrite(&p, sizeof p, 1, fp)!=1) {
               printf("Error: de persoon kan niet verwijderd worden.\n");
            }
         }
      }
      fclose(fp);
   }
}

void zoek(void) {
   FILE* fp;
   fp=fopen("persoon.geg", "rb");
   if (fp==NULL) {
      printf("Error: de file persoon.geg kan niet geopend worden.\n");
   }
   else {
      int sleutel;
      struct Persoon p;
      do {
	      printf("Geef nummer: ");
         fflush(stdin);
      }
      while(scanf("%d", &sleutel)!=1);
      fseek(fp, sleutel * sizeof p, SEEK_SET);
      if (fread(&p, sizeof p, 1, fp)!=1) {
         printf("Error: de persoon kan niet gevonden worden.\n");
      }
      else {
         if (p.leeg==1) {
            printf("Error: de persoon kan niet gevonden worden.\n");
         }
         else {
            printf("%6d %s\n", p.sleutel, p.naam);
         }
      }
      fclose(fp);
   }
}

void drukaf(void) {
   FILE* fp;
   fp=fopen("persoon.geg", "rb");
   if (fp==NULL) {
      printf("Error: de file persoon.geg kan niet geopend worden.\n");
   }
   else {
      struct Persoon p;
      while (fread(&p, sizeof p, 1, fp)==1) {
         if (p.leeg==0) {
            printf("%4d %s\n", p.sleutel, p.naam);
         }
      }
      fclose(fp);
   }
}

void main() {
   int antw;
   do {
      printf("0. Stoppen.\n"
             "1. Afdrukken.\n"
             "2. Toevoegen.\n"
             "3. Verwijderen.\n"
             "4. Zoek op nummer.\n"
             "\n"
             "Geef keuze: ");
		fflush(stdin);
      if (scanf("%d", &antw)!=1) {
      	printf("Error: invoer is geen getal.\n");
      }
      else {
         switch (antw) {
            case 0:
               break;
            case 1:
               drukaf(); break;
            case 2:
               voegtoe(); break;
            case 3:
               verwijder(); break;
            case 4:
               zoek(); break;
            default:
               printf("Error: verkeerde invoer.\n");
         }
      }
   }
   while (antw!=0);
}


