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

标签 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 未被缓冲,序列可能存在一些问题,但这没关系。如果能以跨平台的方式完成就更好了。

最佳答案

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

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

关于c++ - 将 stdout、stderr、cout、cerr 重定向到文件和屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41552920/

相关文章:

c - 如何链接 ELF 文件中的数据以在运行时显示? STM32

c - 使用递归查找字符串开头的单词长度

c - 释放从 realloc 返回的空指针?

javascript - window.location 在 javascript 中不起作用

c++ - 将 blob 从 mysql 复制到 postgres 进展不顺利(我再也看不到图像了)

c++ - 要求的引用折叠规则的简明解释 : (1) A& & -> A& , (2) A& && -> A& ,(3) A&& & -> A& ,以及 (4) A&& && -> A&&

c++ - 为什么 new[] 分配额外的内存?

C++ 控制台 - 格式化输出

redirect - 如何对基于 Ajax 的 URL 使用元刷新?

php - 如何集成AJAX避免PHP CMS的页面重定向