Iterationsszähler an fixer Stelle in Konsole hochzählen



  • Hallo Community,

    wie kann ich eine Iterationszahl in der Konsole so ausgeben, das diese nicht fortlaufend untereinander ausgegeben wird, sondern die Zahl an der gleichen Stelle hochzählt?

    Danke schon mal für Eure Hilfe



  • Windows:

    #include <windows.h>
    
    void SetCursorPosition(int x, int y)
    {
        COORD pos = {x, y};
    
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
    }
    


  • Clear the screen.

    void clear_screen(){
    #ifndef _WIN32
    std::system("clear");
    #else
    std::system("CLS");
    #endif
    }
    


  • Danke. Ich möchte aber nur wirklich an dieser Stelle immer einiges neu ausgeben und anderes, was davor ausgegeben wurde belassen



  • Standard-C++, die einzige mir bekannte Möglichkeit:

    #include <iostream>
    #include <thread>
    #include <chrono>
    
    void countdown(int n){
        for(int x; n--; ){
            std::cout << n << std::flush;
            std::this_thread::sleep_for(std::chrono::seconds(1));
            std::cout << std::string(x = std::to_string(n).size(), '\b')
                      << std::string(x, ' ')
                      << std::string(x, '\b');
        }
    }
    
    int main(){
        countdown(15);
    }
    

    Ansonsten, für Windows, machs wie Belli gezeigt hat.
    Für Linux nutzt du entweder Escape-Sequenzen oder die Ncurses Bibliothek.



  • rewbfkjureh schrieb:

    Clear the screen.

    void clear_screen(){
    #ifndef _WIN32
    std::system("clear");
    #else
    std::system("CLS");
    #endif
    }
    

    Blödsinn!
    Windows:

    void ClearScreen()
    {
        CONSOLE_SCREEN_BUFFER_INFO csbi;
        COORD target = {0, 0};
        DWORD written;
    
        GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
        FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), ' ',
                                                csbi.dwSize.X * csbi.dwSize.Y,
                                                target, &written);
        FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7,
                                                csbi.dwSize.X * csbi.dwSize.Y,
                                                target, &written);
    }
    


  • @Belli,

    Blödsinn ist das nicht.
    Funktioniert prima auf beiden Plattformen und ist für kleine Projekte/Anfänger super angebracht.



  • Naja, system - Aufrufe sind prinzipiell keine so gute Idee ...



  • Man muss nicht päpstlicher sein als der Papst.
    Für Prototyping ist system mehr als geeignet. Wenn es irgendwann Probleme macht, kann man den Befehl ja über die API nachprogrammieren.


Log in to reply