Mam kilka pytań dotyczących twojego kodu:
naglowki.h:linia 10: po co ci te wskaźniki? Przecież i tak w pliku funkcje.cpp alokujesz dla nich pamięć, więc łatwiej byłoby stworzyć zwykłe zmienne (tak jak zmienna TPIN). No i źle ich używasz ;)
funkcje.cpp: 126..127 alokujesz tylko sizeof(int) bajtów pamięci, czyli to tak jakbyś stworzył zwykłą zmienną, a kilka linii niżej używasz ich jak tablice (147..148) Program dziala ale tylko dla pierwszego wywołania funkcji zarejestruj() - dlaczego? bo zmienna licznik jest statyczna, i inkrementowana w funkcji czyli w następnym wywolaniu będzie miała wartość = 2 a wtedy ta linia
plik << PIN[licznik-1];
będzie błędna, bo 2-1 = 1 czyli odwołujesz się nie do miejsca PIN tylko do adresu o jeden dalej - próbujesz odczytać nie zaalokowaną pamięć...
Warunki w liniach 46..54, 73..78, 139..144, 153..158, 174...179 są błędne, ponieważ pozwalają na odczytanie z pliku, mimo że jego otworzenie się nie powiodło. Dopisz w każdej z tych instrukcji wyjście z programu.
funkcje.cpp:70 dopisz przed plik.close() wywołanie metody plik.clear(). Potrzebne, ponieważ operujesz na tym samym obiekcie (o nazwie plik) ale używasz dwóch plików, a każdy z nich ma inne właściwości. Trzeba wyczyścić informacje o otwarciu starego pliku.
Największy błąd - ALOKUJESZ PAMIĘĆ ALE JEJ NIE ZWALNIASZ! (brak operatora delete) - ogólnie to i tak nic złego się nie dzieje bo windows po tobie sprząta, ale jeśli wywołasz funkcję zaloguj kilka razy to stworzysz całkiem spory wyciek pamięci, bo za każdym razem będziesz alokował tablicę intów * ilosc_klientow, ale nigdy tej pamięci nie zwolnisz. Rozwiązanie to użycie operatora delete w odpowiednim miejscu, i tu się pojawia problem, bo nie wiadomo kiedy chcesz to zwolnić, więc lepiej byłoby użyć jakiegoś kontenera na dane, który wyręczyłby Cię z bawienia się alokacją pamięci.
Za kilkanaście minut wstawię poprawiony kod, bo problem z plik.close() jest twoim najmniejszym zmartwieniem