14

呼び出したいのですbar()foo()bar()いくつかのグローバル変数の値を変更します(これは私が望むものです)が、その間にいくつかの出力を生成します(出力は必要ありません)。

void foo() 
{
    //I have tried:
    //system("1>&/dev/null") and of course this won't work
    bar();
}

bar()の出力を抑制するにはどうすればよいですか?

4

1 に答える 1

18

stdoutの前にグローバル変数を保存しbar();、に設定してから/dev/null復元することができます。コード例;

#include <stdio.h>

int main() {
    int old_stdout = dup(1);

    freopen ("/dev/null", "w", stdout); // or "nul" instead of "/dev/null"
    printf("asd1");
    fclose(stdout);

    stdout = fdopen(old_stdout, "w"); 
    printf("asd2");
    return 0;
}

OS Xでテストされていますが、Windowsについてはよくわかりません。

編集:/dev/nullあなたはWindows上で置き換えることができnulます。fdopen()とWindowsでの動作についてはdup()、私のページによるとPOSIX.1標準の一部ですが、manテストしていません。

編集2:コメントで提案されているように、ソリューションがWindowsで機能しない場合は、このSO回答に別の提案があります。

編集3:これを行うためのより長い、ただし標準に準拠したクロスプラットフォームの方法は次のとおりです。(前述のSOの質問から適合したコード、および_dupに関するMicrosoftのドキュメント)

#include <stdio.h>

#ifdef _WIN32
#include <io.h>
char * const nulFileName = "NUL";
#define CROSS_DUP(fd) _dup(fd)
#define CROSS_DUP2(fd, newfd) _dup2(fd, newfd)
#else
#include <unistd.h>
char * const nulFileName = "/dev/null";
#define CROSS_DUP(fd) dup(fd)
#define CROSS_DUP2(fd, newfd) dup2(fd, newfd)
#endif

int main() {
    int stdoutBackupFd;
    FILE *nullOut;
    /* duplicate stdout */
    stdoutBackupFd = CROSS_DUP(STDOUT_FILENO);

    fflush(stdout);
    nullOut = fopen(nulFileName, "w");
    CROSS_DUP2(fileno(nullOut), STDOUT_FILENO);

    printf("asd1\n");
    fflush(stdout);
    fclose(nullOut);

    // Restore stdout
    CROSS_DUP2(stdoutBackupFd, STDOUT_FILENO);
    close(stdoutBackupFd);

    printf("asd2\n");

    return 0;
}

フラッシュは、(1)stdoutをコンソール(またはパイプ)に切り替える前に印刷されたものが実際に画面に印刷され、(2)stdoutをコンソール(またはパイプ)に戻す前に印刷されたものが何も印刷されないことを確認するために必要です。

于 2012-11-21T16:58:23.937 に答える