gpt4 book ai didi

c++ - 使用 std::cout 将 "\r"写入文件会保存之前覆盖的行

转载 作者:行者123 更新时间:2023-11-27 22:45:28 25 4
gpt4 key购买 nike

我正在使用 C++ 运行模拟,为了跟踪模拟进度,我将输出写为 std::cout << "\rSimulation progress: " << progress; ,根据这个答案 https://stackoverflow.com/a/3057994/4237753 .所以用 "\r"我以为我覆盖了前一行,但是当我将输出保存到日志文件时,之前覆盖的行也被保存了,带有 ^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

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

谢谢!

最佳答案

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

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

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

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

关于c++ - 使用 std::cout 将 "\r"写入文件会保存之前覆盖的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43655823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com