我在远程 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
,无论端子宽度...
我错了吗?如果是这样,我如何(如果可能)得到我想要的东西?如果不是,问题出在哪里?
最佳答案
回车不是由您的程序或标准库处理,而是由显示文本的终端程序处理。它只转到当前行的开头,即光标当前所在的行,如果有换行,则该行不是上一行的开头。因此,请确保您打印的文本长度不足以导致换行。
关于c++ - Linux终端: carriage return stuck at line wrap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44499186/