簡體   English   中英

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

[英]C printf: insert line above printed text

我想在打印行上方使用 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 解決方案很好,但我並沒有完全按照我的意願工作。

顯然這取決於你的終端支持什么,但如果它支持\\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插入行\\033[<count>L

編輯:顯然,您可以根據需要多次重復此操作,即,您不必事先知道要插入多少行以及插入位置,只要在每批插入后返回到最后一行即可. 例如,您可以通過始終在底部打印一個換行符來一次插入一行,然后向上移動到插入位置(記住考慮您剛剛添加的一行),在那里插入該行,然后移動回到底部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM