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

标签 c++ linux terminal openmp carriage-return

我在远程 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/

相关文章:

c++ - 虚拟方法返回代表派生对象类型的枚举 - 可以吗(就设计而言)?

c++ - 我如何在 linux 上使用 waf 引用 xerces 库

python - 如何通过 Python 为 Windows 和 Linux 获取用户登录/注销时间?

shell - 仅对文件的前 100 行进行排序

python - 了解 Python 交互式解释器中的打印字节

c++ - 从创建线程设置线程的 "nice level"?

c++ - 使用 Clang 和 WebAssembly 导入外部符号

c++ - C++ 中的翻译单元与编译单元与目标文件与可执行文件与....

linux - 如何在每个月的第一个星期五运行cronjob?

perl - 终端中的键盘事件