Znaki w UNICODE zajmują 4 bajty ale nie każdy znak wykorzystuje całą tą przestrzeń (dało by się go zapisać w 3, 2 lub jednym bajcie) więc stosuje się (że tak powiem) "kompresję" czyli kodowanie UTF-8, UTF-16. Dzięki temu jedne znaki zajmują jeden bajt, inne dwa bajty, a jeszcze inne nawet 6 bajtów. Ale aby rozpoznać czy znak zajmuje 3, 2 lub jeden bajt trzeba było mu dodać w pierszym bajcie na początku kilka bitów rozpoznawczych - te kilka bitów powoduje, że kod UTF-8 jest inny niż kod UNICODE.
Problem będziesz miał gdy w pliku będzie znak składający się z jedego bajta (np. znak B kod 0x42 ) a dopiero potem znak składajacy się z dwóch bajtów (np. Ą - kod 0xC484) a za nim znów B. Wczytująć `wchar_t` pobierzesz znak składajacy sie z jednego bajtu oraz pierwszy bajt z drugiego znaku czyli w sumie 0x42C4. Drugie użycie `wchar_t` pobierze drugi bajt z litery Ą i bajt z drugiej litery B czyli w sumie 0x8442. Tak więc za każdym razem pobierzesz coś co nie ma wartości 0xC484 :)
Szukaj lepiej biblioteki do obsługi UTF-8 albo musisz bardziej rozbudować pobieranie znaków bo jeden znak może mieć długośc od jednego bajtu do 6 bajtów
https://pl.wikipedia.org/wiki/UTF-8