Moja opinia?
system(...) - tej funkcji nie używaj. Problem z bezpieczeństwem i wieloma innymi rzeczami jak multiplatformowość. Użyj SetConsoleTextAttribute instead.
Ustawiasz pozycję kursora na sztywno (linie 13-16). WinApi ma funkcje do pobierania wielkości bufora konsoli - tego prawdziwego jak i widzialnego.
Sleep(...) - tego też nie używaj.. includuj thread i chrono i zrób sobie std::this_thread::sleep_for(std::chrono::JEDNOSTKA_CZASU(ILOSC))
----WRAŻENIA WIZUALNE----
:V
Trochę za długie to jest. Pod cmder'em konsola wariuje, napis loading jest na środku, a na dole leci jakiś pasek z kwadracików (kodowanie złe) do 1 1/8 (na oko) paska. Wygląda to tak
Ja bym zrobił mały pasek, który składałby się z max 10-12 kratek.
---Á PROPOS KODU----
Zamiast bawić się z jakimiś pętlami itd pobawiłbym się z operatorem dzielenia i modulo. Chodzi o to, że jak masz np. 50kB danych do wysłania (załóżmy, że masz lekkiego klienta FTP na konsoli), to dzielisz sobie to na 12, wychodzi Ci 4.xxxxx, co oznacza, że co 4kB wysłane musisz zapalić jedną kratkę z loading bara i tutaj właśnie jest zabawa z modulo i dzieleniem. Dodatkowo trzeba to jeszcze gdzieś zapisywać, bo jakby np. przerwało nagle połączenie, to przecież nie może być tak, że połowa danych wysłana, a loading bar leci od początku (ale to już zależne od przypadku)
PS
Zapomniałem. Jeszcze trzeba się zmagać z tym, że przecież data może mieć NP te 50kB, a ty chcesz mieć loading bar szerokości 12kratek. Wtedy trzeba robić jakieś align'y czy inne cuda.