如何在C ++中从std :: cout删除一行?

时间:2019-07-16 14:04:39

标签: c++ output

我想编写一个计时器程序,该程序显示从x秒到0秒的时间,例如,如果x = 10s:10s-9s-8s ... 1s。但是,我想每秒擦除一次:当程序在cout中写入“ 9s”时,我想擦除“ 10s”。您知道如何擦除std :: cout中写的上一行吗?我在linux上,但如果可能的话,我希望代码可移植。

我尝试了std::cout << "\r";,但是没有用,例如,使用了十秒钟的计时器,程序等待了十秒钟,然后写入“ 1s”。

这是我的代码:

#include <iostream>
#include <thread>
#include <chrono>

std::string convert(unsigned short int seconds);

int main()
{
    unsigned short int seconds {};
    std::cout << "Entrez le temps en secondes du minuteur : ";
    std::cin >> seconds;
    std::cout << std::endl;
    for (unsigned short int i {seconds}; i != 0; i--)
    {
        std::string time {convert(i)};
        std::cout << '\r' << time ;
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    }
    return 0;
}

std::string convert(unsigned short int seconds)
{
    if (seconds < 60)
        return std::to_string(seconds) + "s";
    else if (seconds >= 60 && seconds < 3600)
        return std::to_string(seconds/60) + "min " + std::to_string(seconds%60) + "s";
    else
        return std::to_string(seconds/3600) + "h " + std::to_string((seconds%3600)/60) + "min " + std::to_string(seconds%60) + "s";       
}

谢谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您不刷新缓冲区,因此您仅看到最后一行,可以cout在内部刷新std::cout.flush();,还请记住,您的代码仅重写该行的开头,因此10s将更改为9ss

这会有所帮助

 std::cout << '\r' << time;
 std::cout.flush();