Как сделать анимацию загрузки в консольном приложении, написанном на C++?
я кодирую консольное приложение на c++ , и мне нужно сделать что-то вроде "загрузки".gif " просто с помощью символов ASCII.
ниже приведен список символов, которые я должен использовать:
- --
- |
- /
- --
эти символы сделают анимацию загрузки на велосипеде.
однако, когда я пишу вывод, он становится например:
выходная строка 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... ?
}
}