从控制台 C++ 抓取打印语句
Grabbing printed statements from console C++
我的程序中有两个记录器。一个是我在图形用户界面中制作的,另一个是超级复杂但设计精良并打印到控制台的。我正在尝试将输出从漂亮的控制台记录器获取到呈现的记录器。我已经在阳光下尝试了所有方法来让它工作,但我似乎无法弄清楚(由于我对其他记录器(spdlog)的代码缺乏理解。)我的结论是直接从打印的内容是执行此操作的最佳方法,但我在网上找不到任何人询问如何执行此操作。我看到了一些问题,但它们只是 post 代码作为答案,并没有真正解释发生了什么。 我的问题:有没有一种方法可以从控制台获取打印的语句,这样做的性能如何issues/complications。
例如,如果我执行 std::cout << "hello!" << std::endl;
或一些 printf 语句,我希望能够在代码中进一步向下获取 "hello!"
My conclusion is that taking the logs directly from what is printed is the best way to do this but I can't find online anyone asking how to do this.
现在的控制台是终端仿真器。原始终端的输出进入打印机并且无法(轻松)读回。
应用程序的 stdout
和 stderr
(控制台)流是只写的。此外,在 Windows 和 Unix/Linux 中,您可以将程序的(控制台)输出(stderr
和 stdout
中的一个或两个)通过 |
(管道) 在您的应用程序的 stdout
和另一个应用程序的 stdin
之间创建一个管道 IPC。 IPC 管道是只写的,您的应用程序不可能从中读回。
您也许能够访问 Windows cmd.exe
的帧缓冲区内容,该缓冲区控制其 Windows 控制台 window,但这不会由于 escape sequences interpreted by Windows console.
,您写入 stdout
的数据的逐字精确副本
如果 stdout
被重定向到一个文件,您可以重新打开该文件进行阅读,但是没有可移植的方式来重新打开该文件。
换句话说,没有可移植的方式来读回控制台输出。
I have tried everything under the sun to get this to work but I can't seem to figure it out (due to my lack of understanding of the code from the other logger(spdlog).
我敢打赌您没有尝试阅读 spdlog
文档,尤其是 logger with multi sinks。接收器是一种输出抽象,其实现可以写入文件、内存或两者。您需要的是将您自己的接收器连接到 spdlog
,然后打印到您的 UI.
从 base_sink
派生接收器并实现抽象成员函数:
virtual void sink_it_(const details::log_msg &msg) = 0;
打印成 UI
,并且,
virtual void flush_() = 0;
什么也不做。
然后将您的水槽 class 中的一件物品附加到那个 spdlog
。
我的程序中有两个记录器。一个是我在图形用户界面中制作的,另一个是超级复杂但设计精良并打印到控制台的。我正在尝试将输出从漂亮的控制台记录器获取到呈现的记录器。我已经在阳光下尝试了所有方法来让它工作,但我似乎无法弄清楚(由于我对其他记录器(spdlog)的代码缺乏理解。)我的结论是直接从打印的内容是执行此操作的最佳方法,但我在网上找不到任何人询问如何执行此操作。我看到了一些问题,但它们只是 post 代码作为答案,并没有真正解释发生了什么。 我的问题:有没有一种方法可以从控制台获取打印的语句,这样做的性能如何issues/complications。
例如,如果我执行 std::cout << "hello!" << std::endl;
或一些 printf 语句,我希望能够在代码中进一步向下获取 "hello!"
My conclusion is that taking the logs directly from what is printed is the best way to do this but I can't find online anyone asking how to do this.
现在的控制台是终端仿真器。原始终端的输出进入打印机并且无法(轻松)读回。
应用程序的 stdout
和 stderr
(控制台)流是只写的。此外,在 Windows 和 Unix/Linux 中,您可以将程序的(控制台)输出(stderr
和 stdout
中的一个或两个)通过 |
(管道) 在您的应用程序的 stdout
和另一个应用程序的 stdin
之间创建一个管道 IPC。 IPC 管道是只写的,您的应用程序不可能从中读回。
您也许能够访问 Windows cmd.exe
的帧缓冲区内容,该缓冲区控制其 Windows 控制台 window,但这不会由于 escape sequences interpreted by Windows console.
stdout
的数据的逐字精确副本
如果 stdout
被重定向到一个文件,您可以重新打开该文件进行阅读,但是没有可移植的方式来重新打开该文件。
换句话说,没有可移植的方式来读回控制台输出。
I have tried everything under the sun to get this to work but I can't seem to figure it out (due to my lack of understanding of the code from the other logger(spdlog).
我敢打赌您没有尝试阅读 spdlog
文档,尤其是 logger with multi sinks。接收器是一种输出抽象,其实现可以写入文件、内存或两者。您需要的是将您自己的接收器连接到 spdlog
,然后打印到您的 UI.
从 base_sink
派生接收器并实现抽象成员函数:
virtual void sink_it_(const details::log_msg &msg) = 0;
打印成UI
,并且,virtual void flush_() = 0;
什么也不做。
然后将您的水槽 class 中的一件物品附加到那个 spdlog
。