【发布时间】:2010-10-08 01:02:33
【问题描述】:
我想编写一个简单的 c++/c 控制台应用程序,以显示我的进程 1% 2%。 现在,我像这样逐行打印它
finished 1%
finished 2%
等等
如何在不打印新行的情况下仅更新百分比 x%?
另外,我想打开两个控制台窗口,一个显示消息,一个显示上述过程。如何打开另一个控制台窗口?
【问题讨论】:
标签: c++ c console-application
我想编写一个简单的 c++/c 控制台应用程序,以显示我的进程 1% 2%。 现在,我像这样逐行打印它
finished 1%
finished 2%
等等
如何在不打印新行的情况下仅更新百分比 x%?
另外,我想打开两个控制台窗口,一个显示消息,一个显示上述过程。如何打开另一个控制台窗口?
【问题讨论】:
标签: c++ c console-application
在大多数终端上,您可以打印 ASCII 回车“\r”(十进制值 13)以将光标返回到当前行的左侧,从而覆盖之前的值。或者,您可以发送退格键 ('\b', ASCII 8) 将单个字符向左移动。两者都不会自动删除已显示的内容,但您始终可以使用一些空格覆盖您不再希望看到的任何内容。或者,您可以使用特定控制台支持的控制代码(例如 vt100、vt220...),它们可能具有更高级的功能,例如“清除行尾”。许多库可用于检测终端类型并使用它支持的代码,或者在必要时从许多更简单的操作中综合高级操作:在 Linux 和 UNIX 上,ncurses 库是一个不错的选择。
C++ 没有控制台窗口的概念。打开第二个窗口很大程度上取决于您使用的操作系统,也许还有图形库,您都没有指定。不过,在任何操作系统上,您都可以让应用程序将一些消息写入文件,然后从您自己打开的另一个窗口检查该文件。在 Linux/UNIX 上,实用程序“less”非常适合检查日志文件 - 以及在您运行 less 时向您显示内容,您可以要求它“跟踪”写入文件中的新数据。
【讨论】:
system("view c:\tmp\messages.txt") 传递给第二个查看程序。
在 Windows 上,您可以将光标移动到屏幕上的任何位置,然后从那里开始打印:
COORD c;
c.X = x; c.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
当然,你需要包含windows.h
【讨论】:
您可以通过多种方式更新您的进度消息。您可以打印退格字符以将光标向左移动,然后覆盖旧输出。如果您的控制台支持 ANSI 转义序列,您可以使用转义序列来清除该行并重新绘制它。
使用的最佳技术可能取决于您使用的控制台(不同的控制台支持不同的东西)。您使用的是什么平台,什么控制台?
【讨论】:
您似乎在谈论 Windows 控制台应用程序。
每个 Windows 进程最多关联一个控制台窗口。
如果您想要两个控制台窗口,那么您可以启动另一个进程并将输出通过管道传输给它,或者通过套接字或 Windows“邮槽”或其他方式与它通信。
【讨论】: