我有一个控制台应用程序,需要显示项目的状态,而不是让文字滚动像疯了我宁愿看到目前的状态不断显示在同一行。 为了举例:
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),情况都是如此。
如果Joseph的建议没有给你足够的灵活性,请查看Console API: http : //msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx 。
在Linux中,您可以通过打印\ b和/或\ r到stderr来完成此操作。 您可能需要尝试在Windows中找到合适的组合。