我如何在c ++中创建一个实时更新覆盖前一个条目的循环

时间:2014-12-15 21:44:48

标签: c++

例如:

float count1 = 0;
float count2 = 0;

for(int i = 0; i<1000000; i++) {
    printf("Calculation plus 1: %f", count1);
    printf("Calculation plus 2: %f", count2);
    count1++;
    count2 += 2;
}

如何让这些计数器在终端输出上实时运行,实时更新。 没有使用新的线路。 覆盖以前的输出。 看起来像这样:http://bkm.billking.io/projects/pi/

1 个答案:

答案 0 :(得分:3)

C和C ++都不能提供随处可见的功能。溶液


我用过&#39; \ r&#39;将光标放在一行中第一个字符的顶部。 但这似乎不足以满足您的需求。

(顺便说一下,我认为你的意思是在每个当前版面的末尾都有一个&#39; \ n&#39;)

使用回车的回车的示例:

std::cout << "\r " << showProgressW(" ") << std::flush;

&#39; showProgressW()&#39;生成一个字符串,包括&#34;%完成&#34;和#34;字节数&#34;操作期间的其他进度信息可能需要10秒钟。在此操作期间,没有其他线程可以写入std :: cout(具有线程不安全问题)。


对于文本输出(当用户设备支持此功能时),我发现 ANSI转义序列直接进行。例如:

inline void gotoxy (int col = 1, int row = 1) { printf ("\e[%d;%dH", row, col );   };
inline void gotoxy (char *col, char *row)     { printf ("\e[%s;%sH", row,  col);   };

使用这些函数,您可以将光标放回任何输出字段的第一个字符的顶部,然后输出新值。 (我通常使用std :: cout而不是printf。)还有很多其他的转义序列和组合,可能在简单的工作中很有用,即向上(向下,向左,向右)n行


对于文本输出,其中最小的窗口&#39;风格可能会有所帮助,我使用的是诅咒,这有点参与其中。


我认为下一个选择涉及gui i / o。