Strumienie "szerokie" dokonują w locie konwersji z kodowania ASCII/multibyte na szerokie/unikod (i w drugą stronę, gdy mowa o strumieniach wyjściowych). Dlatego powinieneś ustawić stronę kodową tak, żeby strumienie wiedziały z czego lub na co konwertować znaki szerokie.
W Windowsie może to wyglądać tak:
std::wcin.imbue(std::locale(".852"));
std::wcout.imbue(std::locale(".852"));
Nie wiem, jak jest teraz, ale w MinGW to nie działało. W VC++ i C++ Builder - tak. W pierwszym przypadku trzeba użyć setlocale.
Zastanowiłbym się, czy jest sens konwertować plik do unikodu po to, by znaleźć jakiś wzorzec. Jeśli plik i wzorzec są w tym samym kodowaniu, to nie ma sensu używać do tego znaków szerokich.