我需要将stdout转发到不同的文件,以分离生成的一些打印件并恢复到正常的标准输出。
我使用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以前一种方式重定向多次)我无法将其恢复为原始标准输出。我尝试了以下方法:
freopen("/dev/stdout", "w", stdout);
但它似乎不起作用..只是为了我在macosx上开发的信息。
我该怎么办?
提前致谢
答案 0 :(得分:11)
这可以使用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()");
}
答案 1 :(得分:-1)
这似乎是一种解决问题的迂回方式。为什么不用fopen()
打开每个文件,然后用FILE *
,fputs
,fprintf
等写入fwrite
?无需重定向标准输出。