printf и wprintf одновременно

Модератор: Модераторы разделов

qu4
Сообщения: 20
ОС: Gentoo Linux

printf и wprintf одновременно

Сообщение qu4 »

Можно ли в программе на C одновременно использовать printf и wprintf?

Вот такая программа:

Код: Выделить всё

#include <stdio.h>
#include <locale.h>
int main(void){
setlocale(LC_ALL, "");
printf("short\n");
wprintf(L"wide\n");
printf("short again\n");
return 0;}
выводит текст:

Код: Выделить всё

short
short again


А такая:

Код: Выделить всё

#include <stdio.h>
#include <locale.h>
int main(void){
setlocale(LC_ALL, "");
//printf("short\n");
wprintf(L"wide\n");
printf("short again\n");
return 0;}
выводит текст:


То есть работает только та функция, которую вызываю первой. Можно ли как-то использовать обе?

64-битный линукс Gentoo, локаль ru_RU.UTF-8, glibc 2.9_p20081201-r2, если это имеет значение.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: printf и wprintf одновременно

Сообщение NickLion »

qu4 писал(а):
06.10.2009 12:18
Можно ли в программе на C одновременно использовать printf и wprintf?

И да, и нет.
(http://www.gnu.org/software/libc/manual/html_node/Streams-and-I18N.html#Streams-and-I18N) писал(а):Being able to use the same stream for wide and normal operations comes with a restriction: a stream can be used either for wide operations or for normal operations. Once it is decided there is no way back. Only a call to freopen or freopen64 can reset the orientation.

1. По идее, можно переоткрыть, но это не очень удобно.
2. Проще так (см. регистр):

Код: Выделить всё

    wprintf( L"%s", "Line 1\n" );
    wprintf( L"%S", L"Line 2\n" );
    wprintf( L"%s", "Line 3\n" );
Спасибо сказали:
qu4
Сообщения: 20
ОС: Gentoo Linux

Re: printf и wprintf одновременно

Сообщение qu4 »

NickLion писал(а):
06.10.2009 22:53
Only a call to freopen or freopen64 can reset the orientation.

1. По идее, можно переоткрыть, но это не очень удобно.

Почему? Просто лишняя функция глаза мозолит?
И с какими параметрами вызывать freopen?
freopen(stdout, "a", stdout) ?
2. Проще так (см. регистр):

Код: Выделить всё

    wprintf( L"%s", "Line 1\n" );
    wprintf( L"%S", L"Line 2\n" );
    wprintf( L"%s", "Line 3\n" );

Спасибо, не сообразил :)
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: printf и wprintf одновременно

Сообщение NickLion »

qu4 писал(а):
07.10.2009 01:45
NickLion писал(а):
06.10.2009 22:53
Only a call to freopen or freopen64 can reset the orientation.

1. По идее, можно переоткрыть, но это не очень удобно.

Почему? Просто лишняя функция глаза мозолит?
И с какими параметрами вызывать freopen?
freopen(stdout, "a", stdout) ?

"По идее" - это означает, что я сходу не придумал как переотркыть стандартный выход. А думать было лень.
"не очень удобно" - да, действительно, лишняя функция мозолит глаза, не нравятся лишние временные затраты на переоткрытие потока и т.д.
Переоткрыть можно так:

Код: Выделить всё

    FILE* fo = fopen( "/dev/stdout", "a+" );
    fprintf( fo, "Line 1\n" );
    freopen( "/dev/stdout", "w+", fo );
    fwprintf( fo, L"Line 2\n" );
    freopen( "/dev/stdout", "w+", fo );
    fprintf( fo, "Line 3\n" );

stdout не подхватывает, думать было лень :)

UPD подхватывает stdout, но как-то странно... в обычной консоли - все хорошо, а в выводе программы в QtCreator порядок строк меняется, не гуд, но думать лень...
Спасибо сказали:
qu4
Сообщения: 20
ОС: Gentoo Linux

Re: printf и wprintf одновременно

Сообщение qu4 »

NickLion писал(а):
07.10.2009 07:21
UPD подхватывает stdout, но как-то странно... в обычной консоли - все хорошо, а в выводе программы в QtCreator порядок строк меняется

Случайно не связано с багом tty в ядре? :)

За примеры спасибо.
Спасибо сказали:
qu4
Сообщения: 20
ОС: Gentoo Linux

Re: printf и wprintf одновременно

Сообщение qu4 »

На всякий случай: man 3 printf говорит, что не следует пользоваться %S и %C. Только %ls и %lc.
Спасибо сказали: