在 std::ofstream 中复制 std::cout (c++)

Copy std::cout inside a std::ofstream (c++)

我目前正在尝试制作一个非常基本的“日志系统”,我想将 std::cout 内容复制到 std::ofstream 中以制作一个“日志”文件来打印我发送到的内容cout.

std::cout << "[LOG] My log message\n";
std::cout << "[LOG] My log message2\n";
std::ofstream s("Log.txt");
//std::cout >> s; ????????????

这是我尝试过的方法,但没有成功。 我希望 Log.txt 有:

[LOG] My log message
[LOG] My log message2

你不能一边吃蛋糕一边吃。每个流对象只能绑定到一个缓冲区,并且std::cout不会倒退(你可以写入它,但你不能从它读取)。

因此,虽然您可以重定向 cout 以转到任何其他流,但这仅对发生在 重定向之后的输出有效。绝对没有办法强制打印到 cout before 的数据出现在任何其他流 now 中,除非您有办法重新创建数据或从其他存储(不是 cout)中提取数据。

您可以通过从 std::ostream.

派生您自己的 class 来简单地创建您自己的 T (Tee) 流

这很简单,基本上你只需要覆盖流 syncoverflow 函数,并将数据发送到两个所需的输出。

您可以找到 Tee 流的完整示例 here and here

在此示例代码中,我 select 使用命令行选项输出到哪里。而且,它的美妙之处在于,您可以使用所有现有的 IO 流设施。而且,它是完全透明的。