C++ 如何在Windows本机C+;中覆盖控制台的相同部分+;控制台应用程序,不使用第三方库?

C++ 如何在Windows本机C+;中覆盖控制台的相同部分+;控制台应用程序,不使用第三方库?,c++,windows,console,C++,Windows,Console,我有一个控制台应用程序,需要显示项目的状态,但与其让文本疯狂地滚动,我宁愿看到当前状态一直显示在同一行上。举例来说: 正在运行。。。nn%完成 缓冲区大小:bbbb字节 应该是输出,其中“nn”是当前完成百分比,“bbbb”是缓冲区大小,在控制台的同一行上定期更新 我采取的第一种方法只是在打印新状态之前将正确数量的退格打印到控制台上,但这有一个我想要消除的讨厌的闪烁。我还想坚持使用标准库或MS提供的功能(VC 8),以免为这一简单需求引入另一个依赖项。在Linux中,您可以通过将\b和/或\r打

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

正在运行。。。nn%完成

缓冲区大小:bbbb字节

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


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

在Linux中,您可以通过将\b和/或\r打印到stderr来实现这一点。您可能需要尝试在Windows中找到正确的内容组合。

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

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


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

如果Joseph的建议没有给您足够的灵活性,请查看控制台API:。

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

对于我的简单案例,最直接的方法似乎基于:


对于更复杂的问题,与from提供的示例相协调,提供的完整内容可能会证明是有用的,但我发现使用
CHAR\u INFO
对于这样一个简单的应用程序来说太单调乏味了。

请参阅我的答案以了解更多详细信息,但对于我的简单案例,这是最简单的方法。
// 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
  //...
}