texto - ¿Cómo hacer una animación de carga en la aplicación de consola escrita en C++?
programas en c++ (7)
La versión de 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;
}
Estoy codificando una aplicación de consola en c ++ y necesito hacer algo como "cargar.gif" simplemente usando caracteres ASCII.
La siguiente es la lista de los personajes que debería estar usando:
- -
- /
- |
- /
- -
Estos símbolos harán una animación de carga por ciclismo.
Sin embargo, cuando escribo el resultado, se convierte en:
Línea de salida 1: - Línea de salida 2: / Línea de salida 3: | Línea de salida 4: / Línea de salida 5: -
Necesito hacer esto así:
Línea de salida 1: [esto será reemplazado todo el tiempo]
Nunca debería ir a la segunda línea.
¿Cómo puedo hacer esto en C ++? ¿Hay algún tipo de función de reemplazo ?
Puede usar el carácter de retroceso ( ''/b''
) para retroceder y sobrescribir caracteres en la consola. También deberá vaciar la salida después de cada cambio, de lo contrario la salida podría permanecer en un búfer y no aparecer en la consola.
Aquí hay un ejemplo simple:
#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;
}
}
Lógica de Mike Seymour utilizada pero con un aspecto realista.
#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;
}
}
Y una respuesta multiplataforma:
#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;
}
Tenga en cuenta que chrono_literals solo está disponible en c ++ 14, puede usar std::chrono::seconds s(1);
en su lugar, pasa s
a std::thread::sleep_for();
for(i=0; i<100; i++)
{
system("cls");
cout << "Loading: " << i << " % /n";
if(i==100)
{
redirect to void or... ?
}
}
Siendo muy simple, puede usar el carácter de retroceso, como se explica aquí , que en realidad parece ser un duplicado de su pregunta. Para cosas más complicadas, se vuelve específico de la plataforma; para establecer la posición del cursor, tal vez esto pueda ayudar , si está en Windows.
#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);
}
}