从c控制台应用程序打印到屏幕覆盖当前行

时间:2011-03-02 18:40:41

标签: c windows linux console-application

我想覆盖c控制台程序中的当前行,以实现类似linux shell命令“top”的输出。如果可能,该方法应该在windows和linux下工作。

while (i < 100) {
       i++;
       sprintf(cTmp, "%3d", i);
       puts(cTmp);
       if ((character = mygetch()) == 'q') {
          break;
       }
    }

我想在每次迭代中覆盖前一个数字,如果可能的话,查看用户是否输入了一个字符而没有暂停循环。如果用户按下'q'键,循环应立即停止。

3 个答案:

答案 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 显示框等等。