Ввод-вывод в поток в кодировке Юникод в текстовом и двоичном режиме
Когда процедура потокового ввода-вывода Юникода (например, fwprintf, fwscanf, fgetwc, fputwc, fgetws или fputws) работает c файлом, открытым в текстовом режиме (по умолчанию), выполняются два типа преобразования символов:
Преобразование Юникод-в-MBCS или MBCS-в-Юникод. Если функция поточного ввода-вывода Юникода работает в текстовом режиме (по умолчанию) исходный или конечный поток рассматривается как последовательность многобайтовых символов. Поэтому входные функции потока Юникода преобразуют многобайтовые символы в расширенные (как если бы для этого вызывалась функция mbtowc). По той же причине выходные функции потока Юникода преобразуют расширенные символы в многобайтовые (как если бы для этого вызывалась функция wctomb).
Преобразование возврат каретки — перевод строки (CR-LF). Это преобразование происходит перед преобразованием MBCS –Юникод (для функций потокового ввода Юникода) и после преобразования Юникод – MBCS (для функций потокового вывода Юникода). Во время ввода, каждое сочетание возврат каретки — перевод строки преобразуется в один символ перевода строки. Во время вывода, каждое символ перевода строки преобразуется в комбинацию возврат каретки — перевод строки.
Однако, если функция потокового ввода/вывода Юникода работает в бинарном режиме, предполагается, что файл будет в Юникоде, и преобразование CR-LF или преобразование символов не происходит во время ввода или вывода. Используйте инструкцию _setmode( _fileno( stdin ), _O_BINARY ); чтобы правильно использовать wcin в текстовом файле Юникода.