以下code:
#include <stdio.h>
main()
{
int fd;
fpos_t pos;
printf("stdout, ");
fflush(stdout);
fgetpos(stdout, &pos);
fd = dup(fileno(stdout));
freopen("stdout.out", "w", stdout);
f();
fflush(stdout);
dup2(fd, fileno(stdout));
close(fd);
clearerr(stdout);
fsetpos(stdout, &pos); /* for C9X */
printf("stdout again\n");
}
f()
{
printf("stdout in f()");
}
正常工作以重定向stdout
,然后将其重新定位。但是,将f()
更改为:
f()
{
wprintf(L"stdout in f()");
}
不允许恢复标准输出。任何人都知道为什么会这样吗?
[matt test] uname -r
3.4.6-2.fc17.x86_64
答案 0 :(得分:2)
问题是由于标准输出的方向。 在调用wprintf()之前,使用mode = 0调用fwide()并检查它是否返回+ ve值。如果是,您可以安全地使用wprintf()。 完成使用wprintf()后,关闭stdout并重新打开它以再次使用普通的printf()。 或者,继续在现有标准输出上继续使用wprintf()和宽字符函数。 一旦stdout具有方向(字节或宽),它就不能被更改并持续直到它被关闭。