Как сделать анимацию загрузки в консольном приложении, написанном на C++?

я кодирую консольное приложение на c++ , и мне нужно сделать что-то вроде "загрузки".gif " просто с помощью символов ASCII.

ниже приведен список символов, которые я должен использовать:

  1. --
  2. |
  3. /
  4. --

эти символы сделают анимацию загрузки на велосипеде.

однако, когда я пишу вывод, он становится например:

выходная строка 1: -- выходная строка 2: выходная строка 3: | выходная строка 4: / выходная строка 5: --

Мне нужно сделать это так:

выходная строка 1: [это будет заменено все время]

Он никогда не должен идти во вторую строку.

Как я могу это сделать на C++? Есть ли какой-либо заменить

7 ответов


вы можете использовать символ backspace ('\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;
}

оставаясь очень простым, вы можете использовать символ backspace,Как пояснил здесь, который на самом деле кажется дубликатом вашего вопроса. Для более сложных вещей он получает платформу; чтобы установить позицию курсора, возможно,это может помочь, Если вы находитесь в Windows.


логика Майка Сеймура используется, но с реалистичным взглядом.

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

и кросс-платформенный ответ:

#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, вы можете использовать , передает s to std::thread::sleep_for();


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

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