我有一个控制台应用程序需要显示项目的状态,但不是像疯了一样滚动文本我宁愿看到当前状态继续出现在同一行.为了举例:
Running... nn% complete
Buffer size: bbbb bytes
应该是输出,其中'nn'是当前完成百分比,'bbbb'是缓冲区大小,在控制台的相同行上定期更新.
我采取的第一种方法只是在打印新状态之前将正确数量的退格打印到控制台,但这有一个令人讨厌的闪烁,我想摆脱它.我还想坚持使用标准库或MS提供的功能(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 //... }
对于更复杂的问题,充分控制台API通过所提供JP的回答,与通过提供的例子协调链接从约瑟夫的回答可能是有用的,但我认为有必要在工作中使用CHAR_INFO
过于繁琐这样一个简单的应用程序.
如果使用\ r进行打印并且不使用将生成换行符或将\n添加到末尾的函数,则光标将返回到行的开头,并打印出您放置的下一个内容.在打印之前生成完整的字符串也可以减少闪烁.
更新:问题已更改为2行输出而不是1,这使我的答案不再完整.可能需要更复杂的方法.JP使用 Console API有正确的想法.我相信以下网站详细介绍了实现目标所需的许多内容.该网站还提到减少闪烁的关键是在显示之前将所有内容渲染到屏幕外.无论何时在屏幕上显示任何内容,无论是文本还是图形(2D或3D),都是如此.
http://www.benryves.com/tutorials/?t=winconsole