【问题标题】:print to screen from c console application overwriting current line从 c 控制台应用程序打印到屏幕覆盖当前行
【发布时间】:2011-07-07 12:15:35
【问题描述】:

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

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

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

【问题讨论】:

标签: c windows linux console-application


【解决方案1】:

为此,您需要访问终端。最简单的方法是使用像 ncurses 这样的库。似乎有一个version 也支持Windows。

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

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

【讨论】:

    【解决方案2】:

    您应该能够使用SetConsoleCursorPosition 之类的东西来操作控制台光标。将光标移动到行首,用空格字符覆盖整行,然后将光标移回行首。您甚至可以将其封装在“clear_line()”函数中以方便使用。

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

    【讨论】:

      【解决方案3】:

      如果这就是你所做的一切,你就不需要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 控制台有点奇怪。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多