Но не нужно чрезмерного оптимизма!Olej писал(а):3. но самый важный результат: printf() будет работать и с типовыми и с широкими символами вперемешку любым образом.
Это работает только потому, что мы вручную (в строке формата) указываем для printf() как преобразовывать элемент вывода.
Переходим к потокам ввода-вывода (FILE*):
Код: Выделить всё
int main() {
setlocale( LC_ALL, "" );
int res;
char cs[] = "строка1\n";
wchar_t ws[] = L"строка2\n";
res = fputws( ws, stdout );
printf( "%d: %m\n", res );
res = fputs( cs, stdout );
printf( "%d: %m\n", res );
res = fputws( ws, stdout );
printf( "%d: %m\n", res );
res = fputs( cs, stdout );
printf( "%d: %m\n", res );
return 0;
}
Код: Выделить всё
olej@nvidia ~/2016_WORK/in.WORK/out $ ./out6a
строка2
строка2
Код: Выделить всё
int main() {
setlocale( LC_ALL, "" );
int res;
char cs[] = "строка1\n";
wchar_t ws[] = L"строка2\n";
res = fputs( cs, stdout );
printf( "%d: %m\n", res );
res = fputws( ws, stdout );
printf( "%d: %m\n", res );
res = fputs( cs, stdout );
printf( "%d: %m\n", res );
res = fputws( ws, stdout );
printf( "%d: %m\n", res );
return 0;
}
Код: Выделить всё
olej@nvidia ~/2016_WORK/in.WORK/out $ ./out6b
строка1
1: Выполнено
-1: Выполнено
строка1
1: Выполнено
-1: Выполнено
P.S. С ptintf(), в общем то, ясно:
- printf() - это библиотечный вызов, не системный, он описан в секции 3 man
- он последовательно вызывает библиотечный sprintf() и затем системный write( 1, ... )
- после sprintf() и формата %ls в строке нет уже никаких wchar_t, только мултибайтные UTF-8, поэтому проблем не возникает
- но если поток вывода разрушен (для char) ранее вызовом fputws(), то уже и строка char[ ], подготовленная sprintf() не может быть выведена.