Forum: PC-Programmierung tastaturpuffer löschen mit C


von Raphael (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

getc/getch?

von Raphael (Gast)


Lesenswert?

mit getch habe ich auch schon rum gepröbelt, aber ohne erfolg...:-(

von Karl H. (kbuchegg)


Lesenswert?

Gleich der erste Google Eintrag zum Suchbegriff "kbhit" liefert
http://www.c-plusplus.de/forum/viewtopic-var-p-is-284396.html

von Raphael (Gast)


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...

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


Lesenswert?

Da fällt mir aber noch was ein.

Du müsstest mit
1
  char c;
2
3
  while( kbhit() {
4
    c = getch();
5
  }

aber eigentlich ohne Probleme den Input Buffer leeren können.

von Raphael (Gast)


Lesenswert?

get che; ist das zauberwörtchen...

obwohl nach beschreibung getch das selbe macht, das eine geht das andere 
nicht....

hauptsache es geht

danke fpr die Hilfe

Grüsse Raphael

von Uhu U. (uhu)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.