На самом деле правильно писать все-таки через потоки, надо только настройки локали задать, как положено.
С Visual Sudio все просто:
std::locale::global(std::locale("Russian"));
std::wcout << L"привет";
Mingw не умеет виндовые локали, поэтому нужно писать
велосипед (за исключением того, что будет
CP_ACP
вместо
CP_OEM