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


