繁体   English   中英

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

[英]print to screen from c console application overwriting current line

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

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

我想在每次迭代中覆盖以前的数字,如果可能的话,请查看用户是否在不暂停循环的情况下输入了字符。 如果用户按下键“ q”,则循环应立即停止。

如果这就是您要做的一切,则不需要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上使用,与大多数其他OS相比,Windows控制台有些奇怪。

为此,您需要访问终端。 最简单的方法是使用ncurses之类的库。 似乎也有支持Windows的版本

使用ncurses,可以给出要输出的字符串的坐标,如下所示:

mvprintw(row, col, "%s", text);

您应该能够使用SetConsoleCursorPosition之类的工具来操纵控制台光标。 将光标移到该行的开头,用空格字符覆盖整行,然后将光标移回到该行的开头。 您甚至可以将其包装在“ clear_line()”函数中以便于使用。

您也可以使用SetConsoleActiveScreenBuffer来执行此操作。 而不是覆盖当前行,而是写入第二个屏幕缓冲区。 完全填充完第二个缓冲区后,使其成为活动缓冲区。 然后,清除原始屏幕缓冲区,并将其用于下一个显示帧等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM