CDT*_*CDT 13 c terminal suppress output
我想打电话给bar()在foo(),bar()会改变一些全局变量的值(这是我想要的),但同时产生一些输出(我不"想要的任何输出);
void foo()
{
//I have tried:
//system("1>&/dev/null") and of course this won't work
bar();
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能抑制bar()输出?
use*_*136 15
您可以保存全局变量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;
}
Run Code Online (Sandbox Code Playgroud)
在OS X上测试过,不确定Windows.
编辑:您可以替换/dev/null与nulWindows上.至于fdopen()和dup()在Windows下工作 - 根据我的man页面,它们是POSIX.1标准的一部分,但我还没有测试过.
编辑2:正如评论中所建议的,如果解决方案不适用于Windows,那么这个SO答案中还有另一个建议.
编辑3:更长,但标准兼容和跨平台的方式如下所示.(代码改编自提到的SO问题,以及Microsoft的_dup文档)
#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;
}
Run Code Online (Sandbox Code Playgroud)
需要刷新以确保(1)在切换stdout之前打印的任何内容确实打印到屏幕上,以及(2)在打开stdout切换到控制台(或管道)之前没有打印任何内容.