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

我有一个控制台应用程序,需要显示项目的状态,而不是让文字滚动像疯了我宁愿看到目前的状态不断显示在同一行。 为了举例:

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

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

在打印新状态之前,我采用的第一种方法只是在控制台上打印了正确数量的后部空间,但这有一个令人讨厌的闪烁,我想摆脱。 我也想要坚持标准库或MS提供的function(VC 8),以免引入另一个依赖项来满足这个简单需求。

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

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的答案提供的完整控制台API ,与通过Joseph的答案 链接提供的示例相结合可能证明是有用的,但是我发现使用CHAR_INFO对于这样一个简单的应用程序CHAR_INFO太乏味了。

如果使用\ r进行打印,并且不使用将生成换行符或将\ n添加到最后的函数,则光标将返回到行的开始位置,然后打印下一个放置的内容。 在打印之前生成完整的字符串也可能会减少闪烁。

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

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

如果Joseph的建议没有给你足够的灵活性,请查看Console API: http : //msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx 。

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