Linux终端:回车卡在换行中

时间:2017-06-12 12:15:18

标签: 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应成功将光标放回P Progress,而不管终端宽度......

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

在Putty中可以关闭自动换行模式:

Settings -> Terminal -> [ ] Auto wrap mode initially on

默认设置为开启。关闭它会禁用自动换行,而是保持线不间断。这也意味着你只能从每条长线上看到窗口宽度允许的符号数量。因此,需要一个支持水平滚动的寻呼机,例如less,才能查看长行的文字。

或者在GNU screen会话中运行您的程序并使用 Ctrl a :wrap来切换换行模式。