15

我有一个需要显示项目状态的控制台应用程序,但与其让文本像疯了一样滚动,我宁愿看到当前状态一直显示在同一行上。例如:

Running... nn% complete
Buffer size: bbbb bytes

应该是输出,其中“nn”是当前完成百分比,“bbbb”是缓冲区大小,在控制台的同一行上定期更新。

我采用的第一种方法只是在打印新状态之前将正确数量的退格键打印到控制台,但这有一个令人讨厌的闪烁,我想摆脱它。我还想坚持使用标准库或 MS 提供的功能 (VC 8),以免为这个简单的需求引入另一个依赖项。

4

5 回答 5

8

您可以使用SetConsoleCursorPosition。您需要调用GetStdHandle来获取输出缓冲区的句柄。

于 2008-09-05T06:12:27.007 回答
7

Joseph, JP 和 CodingTheWheel 都提供了宝贵的帮助。

对于我的简单案例,最直接的方法似乎是基于CodingTheWheel 的回答

// before entering update loop
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bufferInfo;
GetConsoleScreenBufferInfo(h, &bufferInfo);

// update loop
while (updating)
{
  // reset the cursor position to where it was each time
  SetConsoleCursorPosition(h, bufferInfo.dwCursorPosition);

  //...
  // insert combinations of sprintf, printf, etc. here
  //...
}

对于更复杂的问题,JP's answer提供的完整控制台 API与通过Joseph's answer的链接提供的示例相协调可能会很有用,但我发现对于这样一个简单的应用程序来说,使用这些工作太繁琐了。CHAR_INFO

于 2008-09-08T15:03:53.910 回答
5

如果您使用 \r 打印并且不使用将生成换行符或将 \n 添加到末尾的函数,则光标将返回到行首并仅在您放置的下一个内容上打印。在打印之前生成完整的字符串也可以减少闪烁。

更新:问题已更改为 2 行输出而不是 1 行,这使我的答案不再完整。可能需要更复杂的方法。JP 对Console API有正确的想法。我相信以下网站详细介绍了您实现目标所需的许多事情。该网站还提到减少闪烁的关键是在显示之前将所有内容渲染到屏幕外。每当您在屏幕上显示任何内容时,无论是文本还是图形(2D 或 3D),都是如此。

http://www.benryves.com/tutorials/?t=winconsole

于 2008-09-05T06:01:33.647 回答
3

如果约瑟夫的建议没有给您足够的灵活性,请查看控制台 API: http: //msdn.microsoft.com/en-us/library/ms682073 (VS.85).aspx 。

于 2008-09-05T06:12:42.263 回答
0

在 Linux 中,您可以通过将 \b 和/或 \r 打印到 stderr 来完成此操作。您可能需要尝试在 Windows 中找到正确的组合。

于 2008-09-05T05:55:18.810 回答