gpt4 book ai didi

c++ - Linux 终端 : carriage return stuck at line wrap

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:48 25 4
gpt4 key购买 nike

我有在远程 Linux 服务器上运行的 C++ 代码,可通过 MobaXterm 访问。这个过程需要一段时间并且是多线程的,所以我添加了一个进度打印机制,如下所示:

void update_progress() {
omp_set_lock(&lock);
string progress = get_threads_progress();
cout << "\rProgress " << progress;
omp_unset_lock(&lock);
}

如果有三个线程,它可能看起来像这样:

Progress | 23/100 | 42/100 | 89/200

那里有回车符,所以我可以在一行中看到作业的进度。在 48 核机器上运行我的代码时出现问题:进度字符串对于终端来说太长,换行并且回车只会将光标设置回当前行的开头。例如:

// Several threads run this in parallel
for (int i=1; i<=5; ++i) {
update_progress();
}

我会得到类似下面的输出:

Progress | 23/100 | 41/100 | 86/100 | 19/100 | 3/100 | 97/100 | 54/1 
Progress | 23/100 | 42/100 | 86/100 | 19/100 | 3/100 | 97/100 | 54/1
Progress | 23/100 | 42/100 | 86/100 | 20/100 | 3/100 | 97/100 | 54/1
Progress | 23/100 | 42/100 | 87/100 | 20/100 | 3/100 | 97/100 | 54/1
00 | 23/100 | 21/100

我假设回车 \r 应该成功地将光标放回 Progress 中的 P,无论终端宽度...

我错了吗?如果是这样,我如何(如果可能)得到我想要的东西?如果不是,问题是什么?

最佳答案

回车不是在您的程序或标准库中处理的,而是由显示文本的终端程序处理的。它只会转到 current 行的开头,即光标当前所在的行,如果有换行,则该行不是上一行的开头。因此,请确保您打印的文本的长度不足以导致换行。

关于c++ - Linux 终端 : carriage return stuck at line wrap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44499186/

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