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.

Recommended Answers

All 4 Replies

If you have getch, you might have kbhit. That would be the easiest solution.

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);
}

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);
}

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

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.