freopen:恢复原始流

我需要将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上开发的信息。

我该怎么办?

提前致谢

这可以使用fileno,dup和dup2调用来实现。 我在linux上试过这个不确定这是否适用于mac,但我相信你会得到一些与你的设置相同的function。 看看这个示例代码是否适合您。 很抱歉代码中没有error handling。 🙂

  #include  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()"); } 

这似乎是一种解决问题的迂回方式。 为什么不用fopen()打开每个文件,然后用fputsfprintffwrite等写入它的FILE * ? 无需重定向stdout。