将stdout,stderr,cout,cerr重定向到文件以及屏幕

时间:2017-01-09 16:50:43

标签: c++ c redirect stdout stderr

在我相当大的C / C ++控制台应用程序中,我希望将printf,fprintf(stderr,...),cout和cerr的输出重定向到屏幕以及日志文件。

我可以使用“tee”做这样的事情,或者在使用重定向(How can I redirect and append both stdout and stderr to a file with Bash?)启动程序时重定向输出。

但是,我想从主程序中以编程方式执行此操作而不修改现有代码。我希望在main()函数的开头添加一些代码来适当地设置流,以便所有后续调用printf,fprintf(stdout,...),fprintf(stderr,...),cout,cerr等,像往常一样在屏幕上打印输出,但另外还将输出记录到文件中。

序列可能存在一些问题,因为stdout被缓冲而stderr没有被缓冲,但这没关系。如果可以跨平台的方式完成,那就更好了。

1 个答案:

答案 0 :(得分:2)

不仅会更容易,而且让程序用户决定如何重定向程序的I / O,而不是将其构建到程序。如果您愿意,可以在二进制文件周围编写一个包装脚本来设置您描述的重定向,这样人们就不必自己这样做了。

话虽如此,您可以以编程方式执行您所描述的内容,至少在POSIX系统上如此。但是,您必须了解单个流(例如stdout)将单个源与单个接收器连接起来。为了将一个源指向两个接收器,您需要一个中间人,例如tee命令。为了使您的流程透明,您需要分离一个或多个其他流程来处理它,将主流程的标准输出和标准错误流重定向到管道上的子(ren)。你可以在子进程中执行tee,或者你可以推出自己的实现。