tastaturpuffer löschen mit C

Gast #703147
Lesenswert?

Hallo zusammen.

kleine frage:

Eine while schleife wird beendet durch drücken einer beliebigen taste.
ich frage dazu in der schleife den Tastaurpuffer ab mit dem befehl:

kbhit();

ab.

wenn nun das Programm ein zweites mal in diese Schleife kommt wird sie 
sofort beendet ohne dass eine Taste gedrückt wurde. also steht doch da 
noch was im tastaturpuffer? und kbhit() bleibt irgendwie "true"

ich versuchte mit fflush (stdin) den Puffer zu löschen geht dan aber 
trotzdem nicht.

was mache ich falsch???

while (!kbhit()){
           for (sekunde = 0; sekunde < 34000; sekunde = sekunde +1)
                {
                     printf(".");
                     printf("\b");
                    }
  printf("\b\b\b\b\b\b");
  Brenndauer = Brenndauer + 1;
  printf("sek %i",Brenndauer);

 }

danke für eure Hilfe

Grüsse Raphael
Gast #703184
Lesenswert?

auf diese seite bin ich auch schon gestossen, aber hilft ja nicht weil 
mit getch nichts geht....

habe noch folgendes bei google entdekt:
//int c; // int c, nicht char c.
//while ((c = getchar()) != EOF && c != '\n'); // kein {} block, stimmt 
so

das geht, aber erfordert eine bestätigung sonst bleibt er hängen. sollte 
eben auch ohne bestätigung gehen...
#703204
Lesenswert?

Das Problem ist, dass es hier 2 Welten gibt:
Die eine ist die Standard - C Welt.
In dieser Welt gibt es schlicht und ergreifend keine Tastatur.
Es gibt einen Eingabestrom, wo der herkommt ist für C erst mal
uninteressant. Und nein: man kann ihn nicht flushen

Unud dann gibt es noch die Nicht-Standard-C Welt.
In der gibt es eine Tastatur. Nur: Jeder Compiler Hersteller
kocht da sein eigenes Süppchen. Oft funktionieren die Dinge
zwar ähnlich, unterscheiden sich aber trotzdem im Detail.

Du wirst also etwas experimentieren müssen.

Dein Konstrukt müsste dem Prinzip nach in etwas so aussehen
1
  while( !kbhit() ) {    // solange keine Taste gedrückt
2
     ...
3
  }
4

5
  char c = getch();      // nimm den Tastendruck der zum Schleifen-
6
                         // abbruch geführt hat, aus dem Input Stream

Das Prinzip ist also nicht vor dem kbhit() den input buffer
zu leeren, sondern nach einem kbhit() das Zeichen zu entfernen.
#703244
Lesenswert?

Der feine Unterschied zwischen getchar() und getch() ist folgender:

getchar() arbeitet auf stdin, das normalerweise gepuffert ist, aber auch 
in den ungepufferten Modus umgeschaltet werden kann. Header: stdio.h

getch() und kbhit() arbeiten direkt auf dem Tastatupuffer, der nur 1 
Zeichen fassen kann. Header: conio.h

Die Implementierung von stdin greift auf conio zurück, conio ist also 
die primitivere Schicht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren