#include <stdio.h>

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

void voegtoe(void) {
    FILE* fp;
    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;
        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;
        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 {
        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(void) {
    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);
}


