用 std::cout 写入 "\r" 到文件保存以前覆盖的行

Writing "\r" with std::cout to file saves previously overwritten lines

我正在 运行 使用 C++ 进行模拟,为了跟踪模拟进度,我将输出写为 std::cout << "\rSimulation progress: " << progress;,根据这个答案 。所以使用 "\r" 我以为我覆盖了前一行,但是当我将输出保存到日志文件时,之前覆盖的行也被保存了,在 [=27 的每个实例之前都有一个 ^M =] 行。现在我有大约 100MB 的日志文件,而它们只需要几 KB。

文件外观示例:

^MSimulation progress: 66.500^MSimulation progress: 66.600^MSimulation 
progress: 66.700^MSimulation progress: 66.800^MSimulation progress: 
66.900^MSimulation progress: 67.000^MSimulation progress: 67.100^MSimulation 
progress: 67.200^MSimulation progress: 67.300

这一行我想要的只是最后一个实例

Simulation progress: 67.300

有没有真正去除线条的好方法或标准方法?

谢谢!

\r是一个输出控制符号。当您将 \r 写入文件时,它只是其中的一个附加符号。

您不能使用 \r.

覆盖文件中的行

有none。终端没有以任何方式标准化。就像文件一样,它们采用字节流,但它们可以对您提供的输入做出不同的反应。

即有些能够使用转义语法着色。碰巧的是,您正在使用的终端对待 \r 返回到行首并重新开始写入。对于文件输出,它只是一个字节,没有任何特殊含义。您甚至不能保证 \r 会在您 运行 它的每个终端上重置线路。它取决于系统。

我最好的建议是将您的 UI 和您的日志分离。这些通常是不同的事情。您不必将相同的信息放入文件和屏幕中。

为了能够使文件流行为与终端保持一致,需要编写自定义 fstream 缓冲区,它可以识别 \r 并回溯到最后 \n。听起来不太合理。