Olej писал(а):P.S. Сразу возьмём на заметку: freopen() - API POSIX, C ... т.е. проблема потоков не в C++, а в C библиотеке.
Разобравшись с C++ (мне кажется что в исчерпывающей мере), самое время вернуться в C:
Код: Выделить всё
olej@nvidia ~/2016_WORK/in.WORK/out $ make
cc out5a.c -o out5a
cc out5b.c -o out5b
Код: Выделить всё
int main() {
setlocale( LC_ALL, "" );
char cs[] = "строка";
wchar_t ws[] = L"строка";
printf( "%s\n", cs );
printf( "%ls\n", ws );
printf( "%s\n", cs );
printf( "%ls\n", ws );
return 0;
}
Код: Выделить всё
olej@nvidia ~/2016_WORK/in.WORK/out $ ./out5a
строка
строка
строка
строка
Код: Выделить всё
int main() {
setlocale( LC_ALL, "" );
char cs[] = "строка";
wchar_t ws[] = L"строка";
printf( "%ls\n", ws );
printf( "%s\n", cs );
printf( "%ls\n", ws );
printf( "%s\n", cs );
return 0;
}
Код: Выделить всё
olej@nvidia ~/2016_WORK/in.WORK/out $ ./out5b
строка
строка
строка
строка
1. setlocale( LC_ALL, "" ); - выполняет здесь те же функции, что и locale::global( locale( "" ) ); в C++ коде.
2. без него работа с широкими символами будет невозможна, и что самое противное - преобразования из UTF-8 в wchar_t функциями группы mb*() - работать не будут.
3. но самый важный результат: printf()
будет работать и с типовыми и с широкими символами вперемешку любым образом.