C printf:在打印文本上方插入行

时间:2019-12-04 12:36:11

标签: c printf ansi-escape

我想在打印行上方使用printf进行打印,而不会覆盖旧的行。下面的代码显示

0
1
Hallo
A0
A1
A2
A3
A4

我希望输出为

0
1
Hallo
A0
A1
A2
A3
A4
2
3
4

是否可以使用转义码(例如排列)来做到这一点?

#include "stdio.h" 

#define ANSI_LINE_UP                "\033[3A"


int main() {
    for (int i = 0; i < 5; i++) {
        printf("%d\n", i);
    }

    printf(ANSI_LINE_UP "Hallo\n");
    for (int i = 0; i < 5; i++) {
        printf("A%d\n", i);
    }


    return 0;
}

如果相关的话,我使用Kubuntu 18.04。

使我想要的内容更清楚:

我想在最后输出一些printf的输出,所以看起来像这样:

printf(...)    printf(...)

specialprintf(,,,)    specialprintf(,,,)

注意:执行过程中所有打印的顺序可能会有所不同。我只需要普通的,然后是特殊的。如果特殊的顺序不同,则仍然可以。

这是嵌入式项目的一部分。 @Arkku解决方案很好,但是我并没有完全按照我的意愿工作。

1 个答案:

答案 0 :(得分:0)

显然,这取决于您的终端所支持的内容,但是如果它支持\033[<count>L插入,则它应如下工作:

int main() {
    const int up_lines = 3;
    const int new_lines = 6;

    for (int i = 0; i < 5; ++i) {
        printf("%d\n", i);
    }

    for (int i = 0; i < new_lines; ++i) {
        // make space for existing lines to move down
        putchar('\n');
    }
    // move up and insert the new (empty lines)
    printf("\033[%dA\033[%dL", up_lines + new_lines, new_lines);

    for (int i = 0; i < new_lines; ++i) {
        printf("A%d\n", i);
    }

    // move back down below original lines
    printf("\033[%dB", up_lines);

    return 0;
}

基本上,您首先通过输出等于或大于您要插入的行数的换行符来为原始行的下移留出空间(当终端位置离底部很近以至于旧行时,此步骤将变得重要线会移出屏幕)。然后,您向上移动到插入位置(该位置现在已经移动了打印的换行数),并用\033[<count>L插入行数。

edit:显然,您可以根据需要重复多次,即,您不必事先知道要插入多少行以及在哪里插入,只要在每次执行之后都向下移动到最后一行即可。一批插件。例如,您可以一次插入一行,方法是始终总是在底部仅打印一个换行符,然后向上移动至插入位置(记住要考虑到您刚刚在其中添加的一行),然后在该行中插入并移动回到底部。