呼び出したいのですbar()
がfoo()
、bar()
いくつかのグローバル変数の値を変更します(これは私が望むものです)が、その間にいくつかの出力を生成します(出力は必要ありません)。
void foo()
{
//I have tried:
//system("1>&/dev/null") and of course this won't work
bar();
}
bar()
の出力を抑制するにはどうすればよいですか?
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をコンソール(またはパイプ)に戻す前に印刷されたものが何も印刷されないことを確認するために必要です。