Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将stdout、stderr、cout、cerr重定向到文件和屏幕_C++_C_Redirect_Stdout_Stderr - Fatal编程技术网

C++ 将stdout、stderr、cout、cerr重定向到文件和屏幕

C++ 将stdout、stderr、cout、cerr重定向到文件和屏幕,c++,c,redirect,stdout,stderr,C++,C,Redirect,Stdout,Stderr,在我相当大的C/C++控制台应用程序中,我希望将printf、fprintf(stderr,…)、cout和cerr的输出重定向到screen以及日志文件 我可以使用“tee”这样做,或者在启动程序时使用redirection()重定向输出 但是,我希望从主例程内部以编程方式执行此操作,而无需修改现有代码。我希望在main()函数的开头添加一些代码,以适当地设置流,以便对printf、fprintf(stdout,…)、fprintf(stderr,…)、cout、cerr等的所有后续调用都能像

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

我可以使用“tee”这样做,或者在启动程序时使用redirection()重定向输出

但是,我希望从主例程内部以编程方式执行此操作,而无需修改现有代码。我希望在main()函数的开头添加一些代码,以适当地设置流,以便对printf、fprintf(stdout,…)、fprintf(stderr,…)、cout、cerr等的所有后续调用都能像往常一样在屏幕上打印它们的输出,但还要将输出记录到文件中


由于stdout被缓冲而stderr没有被缓冲,所以序列可能会有一些问题,但这是正常的。如果能够以跨平台的方式进行,那就更好了。

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


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

您可以将文件描述符更改为启动时创建的
pipe()
,然后从管道中获得函数
read()
,并将数据分发到您想要的任何其他流。通过在程序的父级中执行重定向,这甚至可能是明智的。我也在想类似的事情。如果我必须把这个过程分开,那么我就能完成它。谢谢。@SantoshTiwari,如果您愿意的话,您也应该能够使用线程而不是进程来完成它。然而,我重申,我认为整个事情都是一个坏主意。