954,535 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

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

Thanks to nanodano for his nifty piece of code! It's not all that easy to check the input buffer under Windows, and the sleep() feature does a nice job relinquishing the CPU while still checking periodically for user input...

cniggeler
Newbie Poster
1 post since May 2009
Reputation Points: 10
Solved Threads: 0
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You