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()");
}

stdoutを復元することはできません。なぜこれが当てはまるのか誰もが知っていますか?

[matt test] uname -r
3.4.6-2.fc17.x86_64
4

1 に答える 1

2

問題は、stdoutの向きが原因です。wprintf()を呼び出す前に、mode = 0でfwide()を呼び出し、+ve値を返すかどうかを確認します。その場合、wprintf()を安全に使用できます。そして、wprintf()の使用が終了したら、stdoutを閉じて再度開き、通常のprintf()を再度使用します。または、その後、既存のstdoutでwprintf()およびワイド文字関数を引き続き使用します。stdoutの方向(バイトまたはワイド)が設定されると、変更することはできず、閉じるまで保持されます。

于 2012-08-01T14:44:22.000 に答える