我正在编写一个C ++程序,它运行一个长数据分析算法。完成运行需要几天时间,因此提示输出"百分比完成"每次程序中的一个新循环开始,以便用户(我)知道计算机不是在某个地方无限循环或已经崩溃。
目前我这样做是最基本的方式,通过将完成百分比计算为浮点数并执行:
//initial input: anagram("", "abc")
//STEP 1: enter the function --> i = 0 for original string "abc"
//anagram("" + "a", "bc") ----> anagram("a", "bc")
//STEP 2: loop through the new, modified string, which is now "bc"
//var i = 0;
//anagram("a" + "b", "c")---> anagram("ab", "c")
//anagram("ab" + "c", [nothing here])
//base case hit, so uniqueOutput["abc"] = 1;
//var i = 1; --> this applies to the string "bc". the loop gets reset to i = 0 once you have a new string to worth with (like below, with "b")
//anagram("a" + "c", "b")
//anagram("ac", "b")
//anagram("ac" + "b", "" )
//base case hit, so uniqueOutput["acb"] = 1;
//STEP 3: increment up on the original string input ("abc") --> so now you are dealing with str[i] === b
//var i = 1;
//anagram("" + "b", "a" + "c")
//anagram("b", "ac") ---> now we need to loop through "ac"!
//anagram("b" + "a", "c")
//anagram("ba", "c")
//anagram("bac", "")---> base case hit, uniqueOutput["bac"] = 1;
//anagram("b", "ac")
//anagram("b" + "c", "a") ---> anagram("bc", "a")
//anagram("bca", "") ---> base case hit, uniqueOutput["bca"] = 1;
//STEP 4: increment up on the original string input ("abc") ---> str[i] === c
//var i = 2;
//anagram ("" + "c", "ab")---> anagram("c", "ab")
//now we need to loop through "ab!" c's index stays the same.
//anagram("c" + "a", "b") ---> anagram("ca", "b")
//anagram("cab", '')---> uniqueOuput["cab"] = 1;
//anagram("c" + "b", "a") ---> anagram("cb", "a")
//anagram("cba", "")----> uniqueOutput["cba"] = 1
但是,当程序有一百万个循环运行时,这有点混乱。另外,如果终端回滚只有1000行,那么一旦程序完成0.1%,我就会丢失在开始时打印出来的初始调试信息。
我想复制一个我在其他程序中看到过的想法,而不是每次写完一个新行完成百分比,我只需用新的百分比完成替换写入终端的最后一行。
我该怎么做?那可能吗?如果是这样,这可以通过跨平台方式完成吗?有几种方法可以做到这一点吗?
我不确定如何清楚地描述我想要做的事情,所以我希望这清楚地表明你理解我想要做的事情。
澄清,而不是看到这个:
std::cout << "Percentage complete: " << percentage_complete << " %" << std::endl;
我想看到这个:
Running program.
Debug info:
Total number of loops: 1000000
Percentage complete: 0 %
Percentage complete: 0.001 %
Percentage complete: 0.002 %
.
.
.
Percentage complete: 1.835 %
然后在下一个循环中,终端应该更新为:
Running program.
Debug info:
Total number of loops: 1000000
Percentage complete: 1.835 %
我希望有足够的信息。
(好的,所以这个输出实际上是100000步,而不是1000000步。)
答案 0 :(得分:1)
使用\n
而不是std::endl
或\r
。不同之处在于,如果没有新行的行,后者会将光标返回到开头。
免责声明(根据Lightness&#39;异议):这不一定是便携式的,所以YMMV。