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 "3[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 解决方案很好,但我没有完全按照我的意愿工作。
显然这取决于您的终端支持什么,但如果它支持 3[<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("3[%dA3[%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("3[%dB", up_lines);
return 0;
}
基本上,您首先要为原始行向下移动腾出空间,方法是输出等于或大于您要插入的行数的换行符(当终端位置非常靠近底部时,此步骤变得相关旧线会移出屏幕)。然后你向上移动到插入位置(现在已经移动了你打印的换行数)并插入带有 3[<count>L
.
的行数
edit: 显然你可以重复多次,也就是说,你不必事先知道要插入多少行和插入哪里,只要你回到最后一行在每批插入之后。例如,您可以通过始终只在底部打印一个换行符来一次插入一行,然后向上移动到插入位置(记住要考虑刚刚在其间添加的一行),在那里插入该行,然后移动回到底部。
我想在打印行上方使用 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 "3[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 解决方案很好,但我没有完全按照我的意愿工作。
显然这取决于您的终端支持什么,但如果它支持 3[<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("3[%dA3[%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("3[%dB", up_lines);
return 0;
}
基本上,您首先要为原始行向下移动腾出空间,方法是输出等于或大于您要插入的行数的换行符(当终端位置非常靠近底部时,此步骤变得相关旧线会移出屏幕)。然后你向上移动到插入位置(现在已经移动了你打印的换行数)并插入带有 3[<count>L
.
edit: 显然你可以重复多次,也就是说,你不必事先知道要插入多少行和插入哪里,只要你回到最后一行在每批插入之后。例如,您可以通过始终只在底部打印一个换行符来一次插入一行,然后向上移动到插入位置(记住要考虑刚刚在其间添加的一行),在那里插入该行,然后移动回到底部。