9

生成された一部の印刷物と通常の標準出力への復帰を分離するために、標準出力を別のファイルに転送する必要がありました。

freopenはこの方法でファイルに切り替えていました:

char name[80];
memset(name, 0, 80);
strcpy(name, "./scripts/asm/");
strcat(name, m_func->m_name->m_value);
strcat(name, ".shasm");
freopen(name, "w", stdout);

実際には機能しますが、プロセスの最後に (stdout が以前と同じ方法で何度もリダイレクトされることに注意してください)、元の stdout に戻すことができません。私は次のことを試しました:

freopen("/dev/stdout", "w", stdout);

しかし、それはうまくいかないようです..私がmacosxで開発している情報のためだけに。

私は何をすべきか?

前もって感謝します

4

2 に答える 2

13

これは、fileno、dup、および dup2 呼び出しを使用して実現できます。Linux でこれを試してみましたが、これが Mac で動作するかどうかはわかりませんが、セットアップで同等の機能が得られると確信しています。このサンプル コードが機能するかどうかを確認してください。コードのエラー処理が不足していて申し訳ありません。:)

    #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()");
    }
于 2009-11-04T13:53:56.200 に答える
-1

これは、問題を解決するための回り道のようです。で各ファイルを開き、、などでfopen()そのファイルに書き込むだけではどうですか? stdout をリダイレクトする必要はありません。FILE *fputsfprintffwrite

于 2009-11-04T13:35:29.437 に答える