【问题标题】:How to remove a line from std::cout in C++?如何从 C++ 中的 std::cout 中删除一行?
【发布时间】:2019-07-16 14:04:39
【问题描述】:

我想编写一个计时器程序,它显示从 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";       
}

感谢您的帮助。

【问题讨论】:

    标签: c++ output


    【解决方案1】:

    你没有刷新你的缓冲区,所以你只看到最后一行,cout 可以使用std::cout.flush(); 手动刷新你也应该记住你的代码只重写了行的开头,所以@987654323 @ 将更改为 9ss

    这会有所帮助

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

    【讨论】:

    • 或:std::cout &lt;&lt; '\r' &lt;&lt; time &lt;&lt; std::flush;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    相关资源
    最近更新 更多