stdout重定向失败,wprintf()

时间:2012-08-01 14:18:14

标签: c stdout io-redirection

以下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

1 个答案:

答案 0 :(得分:2)

问题是由于标准输出的方向。 在调用wprintf()之前,使用mode = 0调用fwide()并检查它是否返回+ ve值。如果是,您可以安全地使用wprintf()。 完成使用wprintf()后,关闭stdout并重新打开它以再次使用普通的printf()。 或者,继续在现有标准输出上继续使用wprintf()和宽字符函数。 一旦stdout具有方向(字节或宽),它就不能被更改并持续直到它被关闭。