【问题标题】:Update and multiple console windows更新和多个控制台窗口
【发布时间】:2010-10-08 01:02:33
【问题描述】:

我想编写一个简单的 c++/c 控制台应用程序,以显示我的进程 1% 2%。 现在,我像这样逐行打印它

finished 1%
finished 2%

等等

如何在不打印新行的情况下仅更新百分比 x%?

另外,我想打开两个控制台窗口,一个显示消息,一个显示上述过程。如何打开另一个控制台窗口?

【问题讨论】:

    标签: c++ c console-application


    【解决方案1】:

    在大多数终端上,您可以打印 ASCII 回车“\r”(十进制值 13)以将光标返回到当前行的左侧,从而覆盖之前的值。或者,您可以发送退格键 ('\b', ASCII 8) 将单个字符向左移动。两者都不会自动删除已显示的内容,但您始终可以使用一些空格覆盖您不再希望看到的任何内容。或者,您可以使用特定控制台支持的控制代码(例如 vt100、vt220...),它们可能具有更高级的功能,例如“清除行尾”。许多库可用于检测终端类型并使用它支持的代码,或者在必要时从许多更简单的操作中综合高级操作:在 Linux 和 UNIX 上,ncurses 库是一个不错的选择。

    C++ 没有控制台窗口的概念。打开第二个窗口很大程度上取决于您使用的操作系统,也许还有图形库,您都没有指定。不过,在任何操作系统上,您都可以让应用程序将一些消息写入文件,然后从您自己打开的另一个窗口检查该文件。在 Linux/UNIX 上,实用程序“less”非常适合检查日志文件 - 以及在您运行 less 时向您显示内容,您可以要求它“跟踪”写入文件中的新数据。

    【讨论】:

    • 嗯...有点棘手 - 据我所知 - Windows 确实提供了一个很好的实用程序来从控制台显示不断增长的文件内容。您可能想自己编写一个程序来读取消息文件,然后从您的 mani 程序启动该程序。如果有帮助,您可以将文件名作为命令行参数 ala system("view c:\tmp\messages.txt") 传递给第二个查看程序。
    【解决方案2】:

    在 Windows 上,您可以将光标移动到屏幕上的任何位置,然后从那里开始打印:

    COORD c;
    c.X = x; c.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
    

    当然,你需要包含windows.h

    【讨论】:

      【解决方案3】:

      您可以通过多种方式更新您的进度消息。您可以打印退格字符以将光标向左移动,然后覆盖旧输出。如果您的控制台支持 ANSI 转义序列,您可以使用转义序列来清除该行并重新绘制它。

      使用的最佳技术可能取决于您使用的控制台(不同的控制台支持不同的东西)。您使用的是什么平台,什么控制台?

      【讨论】:

        【解决方案4】:

        您似乎在谈论 Windows 控制台应用程序。

        每个 Windows 进程最多关联一个控制台窗口。

        如果您想要两个控制台窗口,那么您可以启动另一个进程并将输出通过管道传输给它,或者通过套接字或 Windows“邮槽”或其他方式与它通信。

        【讨论】:

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