Как сделать загрузочную анимацию в консольном приложении, написанную на C ++? - PullRequest
7 голосов
/ 13 декабря 2011

Я пишу консольное приложение на c ++, и мне нужно сделать что-то вроде «loading.gif», просто используя символы ASCII.

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

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

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

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

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

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

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

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

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

Ответы [ 7 ]

12 голосов
/ 13 декабря 2011

Вы можете использовать символ возврата ('\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;
    }
}
6 голосов
/ 13 декабря 2011

Версия 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 голосов
/ 13 января 2015

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

#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;
    }
}
2 голосов
/ 13 декабря 2011

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

1 голос
/ 10 сентября 2017
#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);
    }
}
0 голосов
/ 10 марта 2016
for(i=0; i<100; i++)
{
    system("cls");
    cout << "Loading: " << i << " %  \n";
    if(i==100)
    {    
        redirect to void or... ?
    }
}
0 голосов
/ 14 февраля 2016

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

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

...