Forschrittsbalken in Konsole



  • Hallo!

    Gibt es eine Möglichkeit, in C einen Fortschrittsbalken in der Konsolenausgabe zu realisieren?
    Also z.B. pro Schleifendurchlauf einen Balken weiter und immer eine Prozentanzeige aktualisieren.

    so z.B. vereinfacht

    [III---------]

    Also zwei Grenzen setzen und dazwischen mit weißen Quadraten auffüllen.



  • Ja.
    Du musst nur statt \n ein \r nehmen. Dann Springt der Cursor an den Zeilenanfang.



  • und gibt's auch einen Zeichen für ein weißes Quadrat oder so? 😃



  • jochenb schrieb:

    und gibt's auch einen Zeichen für ein weißes Quadrat oder so? 😃

    Je nachdem, welche Zeichen dein Terminal nicht unterstützt. 🙂

    Ne, such dir was aus:

                           

    Nachtrag: Noch zwei:
    ⬛ ⬜



  • Das hängt von deiner verwendeten Codepage ab. (Z.B. 437)

    Und nebenbei: Für welches System willst du das machen?



  • DirkB schrieb:

    Das hängt von deiner verwendeten Codepage ab. (Z.B. 437)

    Und nebenbei: Für welches System willst du das machen?

    Gibt es noch irgendein Terminal, das nicht UTF8 benutzt?



  • und wie kann ich dann so ein Zeichen ausgeben über printf oder dgl.?



  • Ja, entweder printf mit dem Formatstring ("%c") oder besser gleich mit putchar. Du kannst dir auch erst einmal die Zeichen ausgeben lassen:

    int main()
    {
        const unsigned char ch = 0xFE;
    	int i,k;
    	for(i=0;i<256;++i)
    		printf("%d\t%c\n",i,i);
    	for(i=0;i<80;++i)
    	{
    		putchar('\r');
    		for(k=0;k<i;++k)
    			putchar(ch);
    		Sleep(100); // Systemabhängige Funktion (hier aus winbase.h)
    	}
    	return 0;
    }
    

    Alternativ könntest du bspw. ein char-Array nutzen, dieses mit dem entsprechenden Zeichen initialisieren und jeweils die Nullterminierung nach rechts verschieben (die vorherige Nullterminierung natürlich durch das Zeichen ersetzen).



  • Danke, dass mit dem Array ist ne gute Lösung. Aber wie kann ich die Nullterminierung verschieben?



  • jochenb schrieb:

    Danke, dass mit dem Array ist ne gute Lösung. Aber wie kann ich die Nullterminierung verschieben?

    Entweder indem du eben halt das '\0' (bzw. 0) verschiebst, oder indem du die Terminierung einfach da lässt, wo sie hingehört, nämlich ans Ende. (Und den Rest halt mit irgendwelchen anderen Zeichen füllst.)



  • jochenb schrieb:

    Danke, dass mit dem Array ist ne gute Lösung. Aber wie kann ich die Nullterminierung verschieben?

    Angenommen, Dein Array balken schaut so aus:

    char balken[81] = { '[', '\0', '-', '-' . . . . . }
    

    Aktuell führt ein

    printf ("%s\n", balken);
    

    zur Ausgabe à la

    >> [
    

    Dann kannst Du mit balken[1] auf die '\0' zugreifen und zum Verschieben einfach balken[1] auf '-' oder was Du möchtest setzen - natürlich dann balken[2] auf '\0'
    =>

    >> [-
    

    usw. 🙂

    Den Rest haben Dir ja die anderen schon erklärt 🙂

    Ich habe übrigens auch gern mit sowas rumgespielt und eine seeehr unflätige und total doofköpfig programmierte progressbar gebastelt... Wenn ich mich daran zu erinnern versuche, kommen mir wilde flushes und ähnliches ins Gedächtnis...


Log in to reply