1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Prozentanzeige in C

Discussion in 'Programmieren' started by Muddi, Mar 28, 2008.

Thread Status:
Not open for further replies.
  1. Muddi

    Muddi Megabyte

    Hallo zusammen,

    Ich hoffe mal, mein folgendes Problem ist nicht zu speziell. ;)

    Hab auch schon gegoogelt aber ich kenne den "Fachausdruck" dafür nicht.

    Also das Programm soll eine Prozentanzeige darstellen, die sich auf Kommando sagen wir
    void erhoeheprozentzahl(int umwieviel)

    erhoeht. Ja, klingt ja ganz einfach, aber wenn man nun immer printf benutzt, sieht das Ganze nachher vielleicht so aus:

    5
    8
    9
    45
    65
    80
    81
    93
    100

    Ist natürlich nicht Sinn der Sache, die Prozentzahl soll immer am gleichen "Platz" am Bildschirm bleiben und sich immer aktualisieren. Sodass am Ende des Programms nur noch nie 100 dasteht.

    Ich hoffe jeder weiss, was ich meine ;)

    Gruß,
    Muddi
     
  2. Michi0815

    Michi0815 Guest

    der trick ist backspace. wenn du printf("\b") machst wandert der cursor 1 zeichen nach links und du kannst dort etwas anderes hinschreiben
     
  3. Muddi

    Muddi Megabyte

    Das mit \b hab ich schon probiert.

    Code:
    #include <stdio.h>
    
    int prozahl=0;
    void erhoeheprozzahl(int);
    int main()
    {
    	int i;
    	printf("%d", prozahl);
    	for(i=0; i < 3; i++) {
                    sleep(1);
    		erhoeheprozzahl(10);
                    [COLOR="Red"]fflush(stdout);[/COLOR] //auf keinen Fall unter Linux vergessen!
    	}
    }
    
    
    void erhoeheprozzahl(int u)
    {
    	prozahl+=u;
    	printf("\b\b%d", prozahl);
    }
    Druckt bei mir (gcc auf Linux) nach 3 Sekunden nichtstun (auch kein Ausdrucken von 0 10 20) nur die 30. Es sollte ja so sein 0 Ausdrucken 1 Sek schlafen 10 Ausdrucken und 0 überschreiben 1 Sek schlafen 20 Ausdrucken ...
    Aber so ist es leider nicht :(

    Das mit der Prozentanzeige war natürlich nur son Beispiel ich will eigentlich mehrere Teile des Bildschirms "überschreiben" können.

    Wie zB das Programm fsck oder mplayer hab mir von denen auch schon den Source angeguckt, aber das is doch sehr komplex :eek:

    Das könnte man vielleicht mit long pos=ftell(stdout) und fseek(stdout, pos, 0) irgendwie hintricksen. :rolleyes:
    Wobei ftell(stdout) schon scheitert...

    Edit: hab das fflush(stdout) in der for Schleife vergessen. So gehts.
     
  4. Michi0815

    Michi0815 Guest

    merkwürdig.

    das hier tut bei mir (allerdings unter windows)
    Code:
    #include <stdio.h>
    
    void sleep() {
      int j;
      for (j=0; j<15000000; j++) {
    
      }
    }
    
    int main() {
      int i;
      for (i=0; i<100; i++) {
        printf("\b\b\b\b\b- %i", i);
        sleep();
        printf("\b\b\b\b\b\\ %i", i);
        sleep();
        printf("\b\b\b\b\b| %i", i);
        sleep();
        printf("\b\b\b\b\b/ %i", i);
        sleep();
      }
      return 0;
    }
     
  5. Muddi

    Muddi Megabyte

    Ahhh. Dann werden bei Windows die Zeichen wohl nicht zwischengespeichert im Gegensatz zu Linux, weshalb man auch das fflush(stdout) verwenden muss. Wieder was gelernt.

    Das mit den mehreren Bereichen "kontrollieren" ist dann ja auch kein Problem, solange sie in der gleichen Zeile stehen. Man loescht einfach die ganze Zeile und schreibt sie wieder neu. Eigentlich logisch :)
     
Thread Status:
Not open for further replies.

Share This Page