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

时间:2011-12-13 08:24:46

标签: c++ animation console replace loading

我正在使用c ++编写控制台应用程序,我需要使用ASCII字符来制作类似“loading.gif”的内容。

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

  1. -
  2. \
  3. |
  4. /
  5. -
  6. 这些符号将通过循环来制作加载动画。

    然而,当我写输出时,它变成了:

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

    我需要这样做:

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

    它永远不应该到第二行。

    如何在C ++中执行此操作?是否有任何替换功能?

7 个答案:

答案 0 :(得分:11)

您可以使用退格符('\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;
    }
}

答案 1 :(得分:6)

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;
}

答案 2 :(得分:2)

保持简单,您可以使用退格符as explained here,这实际上似乎与您的问题重复。 对于更复杂的事情,它可以获得特定于平台设置光标位置可能是this can help,如果你在Windows上。

答案 3 :(得分:2)

Mike Seymour的逻辑使用但外观逼真。

#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 << "\b\b\b   \b\b\b" << std::flush;
    }
}

答案 4 :(得分:1)

#include <iostream>
#include <stdio.h>
#include <windows.h>

int main()
{
    for (;;) {

        std::cout << "\b\b\b\b\b\b\b\b\b\bLoading   " << std::flush;
        Sleep(100);
        std::cout << "\b\b\b\b\b\b\b\b\b\bLOading   " << std::flush;
        Sleep(100);
        std::cout << "\b\b\b\b\b\b\b\b\b\bLoAding   " << std::flush;
        Sleep(100);
        std::cout << "\b\b\b\b\b\b\b\b\b\bLoaDing   " << std::flush;
        Sleep(100);
        std::cout << "\b\b\b\b\b\b\b\b\b\bLoadIng   " << std::flush;
        Sleep(100);
        std::cout << "\b\b\b\b\b\b\b\b\b\bLoadiNg   " << std::flush;
        Sleep(100);
        std::cout << "\b\b\b\b\b\b\b\b\b\bLoadinG   " << std::flush;
        Sleep(100);
        std::cout << "\b\b\b\b\b\b\b\b\b\bLoading.  " << std::flush;
        Sleep(100);
        std::cout << "\b\b\b\b\b\b\b\b\b\bLoading.." << std::flush;
        Sleep(100);
        std::cout << "\b\b\b\b\b\b\b\b\b\bLoading..." << std::flush;
        Sleep(100);
    }
}

答案 5 :(得分:0)

跨平台回答:

#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();

答案 6 :(得分:-2)

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