我想覆盖c控制台程序中的当前行,以实现类似linux shell命令“top”的输出。如果可能,该方法应该在windows和linux下工作。
while (i < 100) {
i++;
sprintf(cTmp, "%3d", i);
puts(cTmp);
if ((character = mygetch()) == 'q') {
break;
}
}
我想在每次迭代中覆盖前一个数字,如果可能的话,查看用户是否输入了一个字符而没有暂停循环。如果用户按下'q'键,循环应立即停止。
答案 0 :(得分:8)
如果您正在做的事情,则不需要ncurses
。您需要做的就是将光标移动到行的开头并覆盖其中的内容,并确保刷新输出缓冲区,因为stdout
通常是行缓冲的,如果它连接到终端。这是一个例子:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int i;
for (i = 0; ; ++i) {
printf("\rIteration %d", i);
fflush(stdout);
usleep(250000);
}
}
回车符'\r'
将光标移动到当前行的开头。如果您想做更多比这更奇特的事情,请使用ncurses
库。
我不知道这是否可以在Windows上运行,与大多数其他操作系统相比,Windows控制台有些奇怪。
答案 1 :(得分:2)
要实现此目的,您需要访问终端。最简单的方法是使用像ncurses这样的库。似乎还有version支持Windows。
使用ncurses,您可以给出要输出的字符串的坐标,如下所示:
mvprintw(row, col, "%s", text);
答案 2 :(得分:0)
您应该能够使用SetConsoleCursorPosition之类的东西来操纵控制台光标。将光标移动到行的开头,用空格字符覆盖整行,然后将光标移回到开头。您甚至可以将其包装在“clear_line()”函数中以方便使用。
您也可以使用SetConsoleActiveScreenBuffer执行此操作。而不是覆盖当前行,写入第二个屏幕缓冲区。完全填充第二个缓冲区后,将其设置为活动缓冲区。然后,清除原始屏幕缓冲区并将其用于 next 显示框等等。