2012-06-30 4 views
5

Pobierałem kompilator (myślę, że to było MinGW, ale nie jestem pewien) w systemie Windows 2000 (jestem generalnie użytkownikiem Maca, ale nie było " t my machine), a downloader był aplikacją wiersza poleceń MS-DOS, która wyświetlałaby pasek postępu do pobrania. Coś takiego ...Jak usunąć drukowane znaki z wiersza poleceń w C++

|---     | 15% 
... 
|------    | 30% 
... 
... 
|--------------  | 70% 

z tym, że będzie stale aktualizować w tej samej linii. Zakładam, że program to wykonał, usuwając wcześniej wydrukowane znaki i przedrukując różne, ale nie potrafię wymyślić, jak to zrobić.

Próbowałem wydrukować znak „delete” kilka różnych sposobów, jak (char)8 i \b (nawet \r, co usłyszałem cofa do początku linii w niektórych językach), ale żadna z tych rzeczy działało.

Czy ktoś wie, jak robić tego rodzaju rzeczy?

Edytuj: To pytanie zmieniło się w platformę. Chcę wiedzieć, jak to osiągnąć na komputerze Mac.

+0

Czy "clrscr" to zrobi? –

+1

Powiązane: http://stackoverflow.com/questions/60221/how-to-animate-the-command-line?rq=1 – Pubby

+0

clrscr wyczyści cały ekran, a na komputerze Mac wystarczy wydrukować nowe linie przenieś wszystko poza ekran (co oznacza, że ​​nadal możesz przewijać do niego, co jest przydatne, ale także denerwujące). – anthropomorphic

Odpowiedz

2

Według to Wikipedia:

Konsola Win32 nie obsługuje sekwencje ANSI ewakuacyjnych w ogóle. Oprogramowanie może manipulować konsolą z interfejsem API podobnym do ioctl przeplecionym z tekstem. Niektóre oprogramowanie wewnętrznie interpretują sekwencje specjalne ANSI w drukowanym tekście i tłumaczy je na te wywołania [potrzebne źródło].

Sprawdź to: http://msdn.microsoft.com/en-us/library/ms682073.aspx

wierzę SetConsoleCursorPosition co pozwala zastąpić tekst.

4

Nie jestem pewien, dlaczego wpadłeś w problemy, ale można użyć do tego zarówno \b or \r, użyłem \b.

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <windows.h> 

// This is the only non-portable part of this code. 
// Simply pause for a specified number of milliseconds 
// For Windows, we just call Sleep. For Linux, you'd 
// probably call nanosleep instead (with a suitable 
// multiplier, of course). Most other systems (presumably) 
// have (at least vaguely) similar capabilities. 
void pause(int ms) { 
    Sleep(ms); 
} 

static const int width = 40;  

void show_percent(int i) { 
    int dashes = (width * i)/100; 

    std::cout << '|' << std::left << std::setw(width) << std::string(dashes, '-') << '|' << std::setw(3) << i << "%"; 
} 

int main() { 

    for (int i=0; i<101; i++) { 
     show_percent(i); 
     std::cout << std::string(width+6, '\b'); 
     pause(100); 
    } 
} 
+0

Wierzę, że przenośny sposób to zrobić w C++ 11 byłby 'std :: this_thread :: sleep_for (std :: chrono :: milliseconds (ms));' – anthropomorphic

+0

Mój zły, rozstawałem się. Byłem pod takim wrażeniem twojego kodu show_percent, że zapomniałem wspomnieć, że coś "\ r" w ogóle nie działało. Myślę, że może to mieć związek z różnicą w sposobie, w jaki system Windows, Mac OS X i Linux reprezentują nowe linie. – anthropomorphic

+0

@MichaelDorst: Tak, nie myślałem o tym, dopóki o tym nie wspomniałeś, ale na komputerze Mac od lat używają '\ r' jako znaku nowej linii, więc prawdopodobnie nie jest zaskoczeniem, że robi to po prostu wróć do początku bieżącej linii, tak jak to by było w przypadku zdrowego systemu. Nie mam komputera Mac do przetestowania, ale sprawdź, czy zmodyfikowany kod działa lepiej. –

Powiązane problemy