在C ++中打印到控制台而不会泛滥

时间:2009-09-02 00:27:24

标签: c++ printf

我为一个不准确的标题道歉,但我不确定这究竟是什么。

如何在控制台上打印一条更新线?

例如,如果我想在每个周期打印一个完成百分比状态但是没有使用文本流来控制控制台,我将如何实现这一目标? (这叫做什么? - 未来的谷歌搜索)

谢谢!

5 个答案:

答案 0 :(得分:11)

虽然有一种简单的方法可以使用\r返回到的开头然后覆盖我们之前写的内容,但是没有可移植的方法来清理屏幕。我使用Sleep中的Windows API

#include <iostream>
#include <windows.h>
using namespace std;

int main()
{
 for(int i = 1; i <= 10; i++)
 {
  std::cout << i*10 << '%';
  std::cout.flush(); // see wintermute's comment
  Sleep(1000);
  std::cout << '\r';
 }
}

答案 1 :(得分:3)

诅咒是唯一可以便携的方式。

看看这个:http://code.google.com/p/tinycurses/wiki/basic1

答案 2 :(得分:2)

基本解决方案是:

loop:
    backspace (over written text)
    write (without newline)
    flush
    wait and get updates

或者,你可以尝试使用curses库的解决方案 - 虽然我不确定这是否是你所追求的。 Curses为基于文本的GUI(有时称为TUI)提供基本的ascii图形。

答案 3 :(得分:0)

你的周期有多快?它们是毫秒还是秒。如果您的周期很短,您可能只想在一秒钟之后更新屏幕。

例如

   include <time.h>  /* if memory serves me correctly */
   int currentTime = time(0);
   for ( int i = 0; i < 100; i++)
   {
     /* do work here  and save the percentage completed */
     lastTime = time(0);
     if ((lastTime-currentTime) >= 1 ) 
     {
       /* output percentage completed (using AraK information) */
       currentTime = lastTime;
     }
   }

这将只会每秒更新一次屏幕并节省写入屏幕的时间,因为它会占用重绘屏幕的时间(可用于处理)。此外,如果你的更新速度如此之快,这可以让用户看到你的周期非常短的百分比,因为你可能一直在重新绘制屏幕。

注意:根据评论更新。

答案 4 :(得分:0)

这取决于您使用的平台。我不确定您是如何在Linux上执行此操作的,但在Windows上,您可以使用WriteConsoleSetConsoleCursorPosition来执行此操作。

我不相信除了已经提到的输出大量退格之外,还存在一种完全可移植的方式。退格方法可能会导致大量闪烁,这在您的应用程序中可能是不可接受的...... Win32函数不会导致闪烁。不确定curses库。