用 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
。听起来不太合理。
我正在 运行 使用 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
。听起来不太合理。