본문 바로가기
프로그래밍/C++

C++ ] CLI Loading indicator와 Progress bar

by eteo 2024. 10. 28.

 

 

 

사용자에게 작업이 진행중임을 알리는 간단한 로딩 인디케이터와 프로그레스 바 만들어보기

 

 

 

로딩 인디케이터

 

#include <iostream>
#include <thread>

using namespace std;

bool running = true;

void loading_indicator() {
    const char* states[] = {"     ", ".    ", "..   ", "...  ", ".... ", "....."};
    int index = 0;
    while (running) {
        cout << "\rLoading" << states[index] << flush;
        index = (index + 1) % 6;
        this_thread::sleep_for(chrono::milliseconds(500));
    }
    cout << "\rDone.       " << endl;
}

int main() {

    thread print_status(loading_indicator);

    this_thread::sleep_for(std::chrono::seconds(5));

    running = false;
    print_status.join();

    return 0;
}

 

 

 

 

 

프로그레스 바

 

#include <iostream>
#include <string>
#include <thread>

using namespace std;

class ProgressBar {
private:
    int barWidth;
    int progress;
    char fillChar;
    char emptyChar;

public:
    ProgressBar() : barWidth(50), progress(0), fillChar('='), emptyChar(' ') {}

    void update(float percentage) {
        progress = static_cast<int>(percentage / 100 * barWidth);
        cout << "\r[";
        for (int i = 0; i < barWidth; i++) {
            if (i < progress) cout << fillChar;
            else cout << emptyChar;
        }
        cout << "] " << static_cast<int>(percentage) << "% ";
        cout.flush();
    }

    void setWidth(int width) {
        barWidth = width;
    }

    void setChar(char fill, char empty = ' ') {
        fillChar = fill;
        emptyChar = empty;
    }
    
};

int main() {
    ProgressBar bar;
    bar.setWidth(30);
    bar.setChar('#');

    for (int i = 0; i <= 100; ++i) {
        bar.update(i);
        this_thread::sleep_for(chrono::milliseconds(100));
    }

    return 0;
}