在 C++ 中使用 \r 时如何去掉遗留字符?

How to get rid of left-over characters when using \r in C++?

假设我有以下代码,它是一个无限计数器:

#include <iostream>

int main() {

    short int counter = 0;

    while(true) 
        cout << "This is a counter: " << counter++ << " and I'll keep counting!\r";

    return 0;
}

当你运行带有回车return的代码时,它会覆盖现有的文本,但最后会有多个'!'。有没有不调用clear screen来避免闪烁的方法来解决这个问题?

从上面的评论继续,如果你正在输出到一个 VT 兼容终端(大多数是),你可以使用 ANSI Escape sequences 来控制清除到行尾(以及各种其他光标移动和可见性).

一个使用以回车-return 结尾的行的简短示例,您可以使用 3[K 清除行尾。 ('K' 之前的正式数字是 "0K" 但由于它是默认值可以省略)其他行清除选项是 "1K" 清除到行首,以及 "2K"清除整行。您也可以使用类似的转义来隐藏和恢复光标。

在您的情况下,您可以将前面较长行中的其他字符处理为:

#include <iostream>
#include <unistd.h>

int main (void) {
    
    const char *lines[] = { "You do not ever want\r", 
                            "your favorite dog\r", 
                            "to have\r",
                            "fleas!\r" };
    int n = sizeof lines / sizeof *lines;
    
    std::cout << "3[?25l";                   /* hide cursor */
    
    for (int i = 0; i < n; i++) {
        std::cout << "3[0K" << lines[i];     /* clear to end, output line */
        std::fflush (stdout);
        sleep (2);
    }
    
    std::cout << "3[?25h\n";                 /* restore cursor */
}

正常编译并在您的终端中运行。如果它与 VT 兼容,它将处理转义,因此您会看到打印的每一行都没有来自前一行的任何其他字符干扰输出。

你可以先写一行只有空格的“最大”预期长度,它本身在末尾有一个 \r

或者,在每次迭代中计算您可能需要在新行的末尾填充多少个空格才能达到最大值。