Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C printf:在打印文本上方插入行_C_Printf_Ansi Escape - Fatal编程技术网

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

C printf:在打印文本上方插入行,c,printf,ansi-escape,C,Printf,Ansi Escape,我想在打印行上方使用printf打印,而不覆盖旧行。下面的代码打印出来 0 1 Hallo A0 A1 A2 A3 A4 我希望输出是 0 1 Hallo A0 A1 A2 A3 A4 2 3 4 是否有可能使用转义码(如排队)来执行此操作 #包括“stdio.h” #定义ANSI_线“\033[3A” int main(){ 对于(int i=0;i

我想在打印行上方使用printf打印,而不覆盖旧行。下面的代码打印出来

0
1
Hallo
A0
A1
A2
A3
A4
我希望输出是

0
1
Hallo
A0
A1
A2
A3
A4
2
3
4
是否有可能使用转义码(如排队)来执行此操作

#包括“stdio.h”
#定义ANSI_线“\033[3A”
int main(){
对于(int i=0;i<5;i++){
printf(“%d\n”,i);
}
printf(ANSI_LINE_UP“Hallo\n”);
对于(int i=0;i<5;i++){
printf(“A%d\n”,i);
}
返回0;
}
如果相关,我使用Kubuntu 18.04

为了更清楚地说明我想要什么:

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

printf(…) printf(…)

特殊打印(,,) 特殊打印(,,)

注意:执行时所有打印的顺序可能不同。我只需要先打印正常的,然后是特殊的。如果特殊的顺序不同,也可以


这是嵌入式项目的一部分。@Arkku解决方案很好,但我并没有让它按照我想要的方式工作。

显然这取决于您的终端支持什么,但如果它支持
\033[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;
}
intmain(){
const int up_line=3;
新直线的常数=6;
对于(int i=0;i<5;++i){
printf(“%d\n”,i);
}
对于(int i=0;i
基本上,您首先通过输出等于或大于您要插入的行数的新行数来为原始行下移腾出空间(当终端位置靠近底部,旧行将移出屏幕时,此步骤变得相关)。然后上移到插入位置(现在已按打印的换行数移动)并插入带有
\033[L
的行数


编辑:很明显,你可以根据自己的喜好重复多次,也就是说,你不必事先知道要插入多少行以及插入的位置,只要你在每批插入后向下移动到最后一行。例如,你可以一次插入一行,只需在底部打印一行新行,然后再向上移动到最后一行插入位置(记住要说明刚才添加在中间的那一行),在那里插入行,然后向下移动到底部。

让我知道我的编辑是正确的。你有真实的案例还是只是好奇?你的例子没有多大意义,因为它可以通过修改
printf
s的顺序轻松完成,转义码通常既不可移植,也不易于使用。最可移植的方法是这只是一个简单的例子。我想做一些更复杂的事情,但它也应该这样做。我曾希望ANSI insert line(“\033[3L”)可以做到这一点,但我尝试了,但它不起作用(至少在使用终端应用的macOS上不起作用)在本例中它是有效的,但我不知道将插入多少行。我想在最后打印一些输出,所以在打印这些特殊行后,我必须将光标向上移动。我不想覆盖其他行,这只是一个很好的功能。谢谢您的快速回答。@Iceear您不必知道将插入多少行埃德:您可以使用同样的技术在任意位置一次插入任意数量的行,次数可以任意多。例如,要一次插入一行,打印一个换行符,向上移动到该位置,插入该行,向下移动,重复任意次数。@Iceear或者,不动态打印空行,而使用obta在终端的高度,一开始填充一个屏幕,然后移动到顶部并在该空间内操作。这是嵌入式项目的一部分。我想打印一些由不同线程独立生成的行。线程A无法确定线程B打印了多少行。我想可能有类似的情况插入模式。@Iceear您不需要知道另一个线程打印了多少,只需要知道您要从当前位置向上移动多少个位置。向上移动那么多,插入,向下移动相同的数量。或者,如果您认为每个线程都有一个独立的光标,它们可以在不向上移动的情况下插入,这是绝对不可能的因为终端是一个共享资源,所以要开始工作…(更不用说这将是一个完全不同的问题,例如,“如何在同一终端上为多个线程保持独立的光标位置”。)
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;
}