www.mikrocontroller.net

Forum: PC-Programmierung tastaturpuffer löschen mit C


Autor: Raphael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
getc/getch?

Autor: Raphael (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Raphael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
  while( !kbhit() ) {    // solange keine Taste gedrückt
     ...
  }

  char c = getch();      // nimm den Tastendruck der zum Schleifen-
                         // 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da fällt mir aber noch was ein.

Du müsstest mit
  char c;

  while( kbhit() {
    c = getch();
  }

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

Autor: Raphael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.