在我相当大的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,因此序列可能存在一些问题,但这是可以的。如果可以跨平台的方式完成,那就更好了。
最佳答案
让程序用户确定如何重定向程序的I / O,而不是将其构建到程序中,不仅会更容易,而且还会是一个更好的设计。如果愿意,可以在二进制文件周围编写一个包装器脚本,以设置您描述的重定向,这样人们就不必自己这样做。
这样,您至少可以在POSIX系统上以编程方式进行描述。但是,您必须了解,单个流(例如stdout
)将单个源与单个接收器连接在一起。为了将一个源定向到两个接收器,您需要一个中间人,例如tee
命令。为了使该过程对您的进程透明,您将需要派生一个或多个其他进程来处理它,并将主进程的标准输出和标准错误流通过管道重定向到该子进程。您可以在子进程中执行tee
,也可以滚动自己的实现。
关于c++ - 将stdout,stderr,cout,cerr重定向到文件以及屏幕,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41552920/