我正在使用c ++编写控制台应用程序,我需要使用ASCII字符来制作类似“loading.gif”的内容。
以下是我应该使用的字符列表:
这些符号将通过循环来制作加载动画。
然而,当我写输出时,它变成了:
输出第1行: - 输出第2行: \ 输出第3行: | 输出第4行: / 输出第5行: -
我需要这样做:
输出第1行: [这将一直被替换]
它永远不应该到第二行。
如何在C ++中执行此操作?是否有任何替换功能?
答案 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... ?
}
}