我正在尝试编写一个可以在控制台上在屏幕上非常特定的位置写入的程序。比如说从第20栏到第39栏。
每次写入后,由于\r
参数,该行被“重置”。这可确保该行保持静态,仅更新特定字段。
问题是,我可以指示printf从第0列到第19行写入而不删除行的其余部分,但似乎我无法指示printf从第20列开始写入而不在进程列0中删除19。
有(标准)方法吗? 使用除printf以外的东西是可能的。
[编辑]我已经读过在C中有一个gotoxy()函数,它可以用于Windows,并且可以使用ncurses在Linux中进行模拟。这个功能有问题吗?
答案 0 :(得分:1)
AFAIK没有标准的方法可以做到这一点,因为没有控制台行为标准化(例如Windows'控制台不像Linux一样)
答案 1 :(得分:1)
根据ANSI documentation,您可以使用"\033[1;20H"
来定位光标。
它会将光标移动到所需位置。值1和20是行和列,只需将其更改为正确定位打印。
或者您只能尝试使用"\033[20C"
将光标移至第20列。
答案 2 :(得分:1)
您可以根据需要尝试打印多个退格(和空格以清除旧文本)以定位光标。
不保证它适用于您...如果确实如此:不保证它适用于其他计算机:)
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int i, k;
time_t oldtime = time(0);
if (oldtime == (time_t)-1) {
fprintf(stderr, "time function does not work on this machine\n");
exit(EXIT_FAILURE);
}
while (time(0) == oldtime) /* void */;
printf("fixed stuff: ");
for (i = 1; i < 6; i++) {
int val = pow(10, i) * i;
printf("%d", val);
fflush(stdout);
oldtime = time(0);
while (time(0) == oldtime) /* void */;
if (i < 5) {
for (k = 0; k < i + 1; k++) printf("\b \b"); // go back; erase; go back again
fflush(stdout);
} else {
puts("");
}
}
return 0;
}
它适用于Linux和Windows计算机
答案 3 :(得分:1)
我之前遇到过同样的麻烦。当我在TurboC ++中编码时,我使用了gotoxy()。
检查一下。看起来不错。
答案 4 :(得分:0)
为什么你不只是sprintf(myStr,....并在内存中构建线路然后一次输出? 您可以保留上一次更新所需的字段。
答案 5 :(得分:0)
Marc Rochkind写了一本非常好的书,这是该主题的主要参考! Advanced C Programming for Displays: Character Displays, Windows, and Keyboards for the Unix and Ms-DOS Operating Systems