C++ 在C+中打印到控制台而不泛洪+;

C++ 在C+中打印到控制台而不泛洪+;,c++,printf,C++,Printf,我为一个不准确的标题道歉,但我不确定这到底叫什么 如何向控制台打印一条更新行 例如,如果我想在每个周期打印完成百分比状态,但不想让控制台充斥大量文本,我该如何实现?(这叫什么?——用于未来的谷歌搜索) 谢谢大家! 虽然有一种简单的方法可以使用\r返回到行的开头,然后覆盖我们之前编写的内容,但是没有可移植的方法来清理屏幕。我正在使用windowsapi中的Sleep: #include <iostream> #include <windows.h> using namesp

我为一个不准确的标题道歉,但我不确定这到底叫什么

如何向控制台打印一条更新行

例如,如果我想在每个周期打印完成百分比状态,但不想让控制台充斥大量文本,我该如何实现?(这叫什么?——用于未来的谷歌搜索)


谢谢大家!

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

#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';
 }
}
#包括
#包括
使用名称空间std;
int main()
{

对于(int i=1;i,基本解决方案是:

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

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

curses是可移植的唯一方法


看看这个:

你的周期有多快?以毫秒或秒为单位。如果你的周期很短,你可能只想在一秒钟后更新屏幕

比如说

   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;
     }
   }
include/*如果记忆正确*/
int currentTime=时间(0);
对于(int i=0;i<100;i++)
{
/*在这里工作并保存完成百分比*/
lastTime=时间(0);
如果((lastTime currentTime)>=1)
{
/*完成的输出百分比(使用AraK信息)*/
当前时间=上次时间;
}
}
这只会每秒更新一次屏幕,并节省写入屏幕的时间,因为它会占用重新绘制屏幕的时间(您可以使用它进行处理)。此外,如果更新速度太快,这会让用户看到周期很短时的百分比,因为您可以一直重新绘制屏幕


注意:根据评论进行更新。

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


我不相信有一种完全可移植的方法可以做到这一点,除了前面提到的输出大量的退格。退格方法可能会导致很多闪烁,这在您的应用程序中可能是不可接受的…Win32函数不会导致闪烁。不确定诅咒库。

如需进一步说明,“\r”输出一辆汽车riage return。您可能需要在
Sleep()之前调用
std::cout.flush()
由于
std::cout
是一个缓冲流,因此它的内容可能不会在您期望的时候显示。正如Dan所说,
\r
是回车符,它不会清除行,它只是将光标移回行的开头。@wintermute感谢您的建议。您能提供一个说明cout是buff的参考吗Erd?我想我很久以前就读到了,它不是!@AraK-cerr(和C的stderr)是无缓冲的,但是cin和cout(以及C的stdin和stdout)几乎总是有缓冲的。Curses是唯一能巧妙地实现这个端口的方法。注意,它假设你的控制台是Curses数据库的一部分。需要是time(0)。time()获取一个时间的地址,更新引用的时间(如果给定)。或者,当百分比实际增加时,您可以更新它。如果要显示相同的内容,并且绘制调用的数量不超过101(假设显示为0%->100%),则更新它没有意义,绘图不会对输入的性能有太大影响。我已经有一段时间没有使用时间函数了。我不会说“唯一”方式。如果终端与ANSI兼容,您可以输出“\r”或“\015”。如果它与VT-100兼容,您还可以输出“\033”[5n'发送到TTY,响应将沿着“\033[5;5R”的行,然后您可以发送“\033”[5;0H'转到第5行的开头。这就是ncurses所做的一切。唯一的便携方式。因为cures抽象了终端,所以您不需要知道它是VT-100兼容的或其他任何东西。您可以在几乎任何终端上做您描述的事情,您只需翻阅文档并理解它。这就是为什么我们有诅咒它抽象了终端,所以你不需要知道,这是唯一的便携方式。好的,还有其他库(比如ncurses)。哦,是的,刚刚记住的ncurses只是诅咒,但是一个新版本:-)