1

以下代码

#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
4

1 回答 1

2

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

于 2012-08-01T14:44:22.000 回答