Monitoring an input buffer
I've been trying to solve this problem for a while now with no luck. I want to monitor an input buffer(cin) for a keypress. The catch is, I don't want it to hang if the buffer is empty. getch() and peek() won't work because one waits for a keypress and the other waits for the return key. Is there any way to check for a keypress, but move on if there was no keypress? I know there is a DOS interrupt available in assembly, but I don't know how to do it with C.
nanodano
Junior Poster in Training
78 posts since Feb 2005
Reputation Points: 36
Solved Threads: 2
If you have getch, you might have kbhit. That would be the easiest solution.
Narue
Bad Cop
15,460 posts since Sep 2004
Reputation Points: 6,464
Solved Threads: 1,401
Narue,
I looked up kbhit() and I read that it typically was a Borland Turbo C++ thing. Sure enough though, MS Visual Studio 2005 has a _kbhit() . It worked like a charm! The thing is, kbhit() does not return the key you pressed, only wether a key is pressed or not. So, I wrote a simple piece of code for anyone who might be interested in doing something similar. Also, I noticed that if you fill the buffer with more than one keystroke, and you use getch() it gets the keys one at a time in the order you pressed them.
#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;
void main() {
int hit;
char ch = 0;
do {
hit = kbhit();
if (hit)
ch = getch();
else
ch = 0;
cout << ch << endl;
Sleep(100);
} while(ch != 27);
}
nanodano
Junior Poster in Training
78 posts since Feb 2005
Reputation Points: 36
Solved Threads: 2
I'd like to add something (in case anyone is interested). An issue with the code I previously posted was that if there was a lot of time between calls to kbhit() and you only used one call to getch() then you might still have keystrokes left in the buffer. This might cause a problem if you want to assure you have the most recent keystroke. The simple solution is to nest a loop inside the if statement. I've included a ery slightly modified version of the previous code to show how to make sure you have only the most recent keypress.
#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;
void main() {
int hit;
char ch = 0;
do {
hit = _kbhit();
if (hit) {
while (hit) {
ch = _getch();
hit = _kbhit();
}
}
cout << ch << endl;
Sleep(100);
} while(ch != 27);
}
nanodano
Junior Poster in Training
78 posts since Feb 2005
Reputation Points: 36
Solved Threads: 2