如何在用c++编写的控制台应用程序中制作加载动画

How to make a loading animation in Console Application written in C++?

本文关键字:应用程序 动画 加载 控制台 c++      更新时间:2023-10-16

我正在用c++编写控制台应用程序,我需要通过使用ASCII字符来制作类似"loading.gif"的东西。

下面是我应该使用的字符列表:

  1. ,
  2. |
  3. /
  4. ,

这些符号将通过循环生成加载动画。

然而,当我写输出时,它变得像:

输出行1:——输出行2: 输出行3: |输出行4:/输出第5行:——

我需要这样做:

输出行1:[这将一直被替换]

它不应该到第二行。

我如何在c++中做到这一点?是否有一种替代的功能?

可以使用退格字符('b')返回并覆盖控制台上的字符。您还需要在每次更改后刷新输出,否则输出可能会留在缓冲区中,而不会出现在控制台上。

下面是一个简单的例子:

#include <iostream>
#include <unistd.h> // for sleep()
int main()
{
    std::cout << '-' << std::flush;
    for (;;) {
        sleep(1);
        std::cout << "b\" << std::flush;
        sleep(1);
        std::cout << "b|" << std::flush;
        sleep(1);
        std::cout << "b/" << std::flush;
        sleep(1);
        std::cout << "b-" << std::flush;
    }
}

Microsoft Windows版本。

#include <iostream>
#include <windows.h> // for sleep()
int main()
{
    std::cout << '-' << std::flush;
    for (;;) {
        Sleep(10);
        std::cout << "b\" << std::flush;
        Sleep(10);
        std::cout << "b|" << std::flush;
        Sleep(10);
        std::cout << "b/" << std::flush;
        Sleep(10);
        std::cout << "b-" << std::flush;
    }
    return 0;
}

使用Mike Seymour的Logic,但具有逼真的外观。

#include <iostream>
#include <unistd.h> // for sleep()
int main()
{
    std::cout << "Loading Please Wait";
    while (true)
    {
        sleep(1);
        std::cout << "." << std::flush;
        sleep(1);
        std::cout << "." << std::flush;
        sleep(1);
        std::cout << "." << std::flush;
        sleep(1);
        std::cout << "bbb   bbb" << std::flush;
    }
}
#include <iostream>
#include <stdio.h>
#include <windows.h>
int main()
{
    for (;;) {
        std::cout << "bbbbbbbbbbLoading   " << std::flush;
        Sleep(100);
        std::cout << "bbbbbbbbbbLOading   " << std::flush;
        Sleep(100);
        std::cout << "bbbbbbbbbbLoAding   " << std::flush;
        Sleep(100);
        std::cout << "bbbbbbbbbbLoaDing   " << std::flush;
        Sleep(100);
        std::cout << "bbbbbbbbbbLoadIng   " << std::flush;
        Sleep(100);
        std::cout << "bbbbbbbbbbLoadiNg   " << std::flush;
        Sleep(100);
        std::cout << "bbbbbbbbbbLoadinG   " << std::flush;
        Sleep(100);
        std::cout << "bbbbbbbbbbLoading.  " << std::flush;
        Sleep(100);
        std::cout << "bbbbbbbbbbLoading.." << std::flush;
        Sleep(100);
        std::cout << "bbbbbbbbbbLoading..." << std::flush;
        Sleep(100);
    }
}

非常简单,您可以使用退格字符,正如这里所解释的那样,这实际上似乎是您的问题的副本。对于更复杂的东西,它是平台特定的;来设置光标的位置,如果你在Windows上,这可能会有帮助。

和一个跨平台的答案:

#include <iostream>
#include <chrono>
#include <thread>
/* Comment for c++11 solution. */
using namespace std::literals::chrono_literals;
int main(int argc, char** argv)
{
    /* Uncomment for c++11 solution. */
    // std::chrono::seconds s(1);
    std::cout << '-' << std::flush;
    for (;;) {
        std::this_thread::sleep_for(1s);
        std::cout << "b\" << std::flush;
        std::this_thread::sleep_for(1s);
        std::cout << "b|" << std::flush;
        std::this_thread::sleep_for(1s);
        std::cout << "b/" << std::flush;
        std::this_thread::sleep_for(1s);
        std::cout << "b-" << std::flush;
    }
    return 0;
}

请注意,chrono_literals仅在c++14中可用,您可以使用std::chrono::seconds s(1);代替,将s传递给std::thread::sleep_for();

for(i=0; i<100; i++)
{
    system("cls");
    cout << "Loading: " << i << " %  n";
    if(i==100)
    {    
        redirect to void or... ?
    }
}