我有一个控制台应用程序,需要显示项目的状态,但不是像疯了一样滚动文本我宁愿看到当前状态继续显示在同一行。为了举例:
Running... nn% complete
Buffer size: bbbb bytes
应该是输出,其中'nn'是当前完成百分比,'bbbb'是缓冲区大小,在控制台的相同行上定期更新。
我采取的第一种方法只是在打印新状态之前将正确数量的退格打印到控制台,但这有一个令人讨厌的闪烁,我想摆脱它。我还想坚持使用标准库或MS提供的功能(VC 8),以免为这一简单需求引入另一个依赖。
答案 0 :(得分:8)
您可以使用SetConsoleCursorPosition。您需要调用GetStdHandle来获取输出缓冲区的句柄。
答案 1 :(得分:7)
Joseph,JP和CodingTheWheel都提供了宝贵的帮助。
对于我的简单案例,最直接的方法似乎基于CodingTheWheel's answer:
// 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
//...
}
对于更复杂的问题,console API提供的完整JP's answer与link Joseph's answer提供的示例配合使用可能会有用,但我发现使用CHAR_INFO
所需的工作对于这样一个简单的应用来说太乏味了。
答案 2 :(得分:5)
如果使用\ r进行打印并且不使用将生成换行符或将\ n添加到结尾的函数,则光标将返回到行的开头并打印出您放置的下一个内容。在打印之前生成完整的字符串也可以减少闪烁。
更新 :问题已更改为2行输出而非1,这使我的答案不再完整。可能需要更复杂的方法。 JP对Console API有正确的想法。我相信以下网站详细介绍了实现目标所需的许多内容。该网站还提到减少闪烁的关键是在显示之前将所有内容渲染到屏幕外。无论何时在屏幕上显示任何内容,无论是文本还是图形(2D或3D),都是如此。
答案 3 :(得分:3)
如果Joseph的建议没有为您提供足够的灵活性,请查看Console API:http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx。
答案 4 :(得分:0)
在Linux中,您可以通过将\ b和/或\ r打印到stderr来完成此操作。您可能需要尝试在Windows中找到正确的组合。