在 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) 流
这很简单,基本上你只需要覆盖流 sync
和 overflow
函数,并将数据发送到两个所需的输出。
您可以找到 Tee 流的完整示例 here and here。
在此示例代码中,我 select 使用命令行选项输出到哪里。而且,它的美妙之处在于,您可以使用所有现有的 IO 流设施。而且,它是完全透明的。
我目前正在尝试制作一个非常基本的“日志系统”,我想将 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
.
这很简单,基本上你只需要覆盖流 sync
和 overflow
函数,并将数据发送到两个所需的输出。
您可以找到 Tee 流的完整示例 here and here。
在此示例代码中,我 select 使用命令行选项输出到哪里。而且,它的美妙之处在于,您可以使用所有现有的 IO 流设施。而且,它是完全透明的。