Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > How to determine end of std::cin

Reply
Thread Tools

How to determine end of std::cin

 
 
Johannes Meng
Guest
Posts: n/a
 
      03-02-2007
Good day,

I'm experimenting with unbuffered input at the moment. To get input I
basically use cin.get(). My problem are control sequences preceeded by an
ESC character (i.e. up, down, f-keys et cetera). They basically look like
this: <ESC><EXCODE><CODE>, where EXCODE is a number describing the type of
key pressed and CODE is the actual key. I want to be able to decide whether
ESC or such a control key was pressed. Now if I do it like this:

char code = 0, excode = 0;
code = cin.get()
if (code == 27) {
excode = cin.get();
code = cin.get();
}

, then I will have proper codes for all control keys. If ESC is pressed,
though, the user will actually have to press three times - because
cin.get() seems to wait for actual input to appear in stdin.
Now I tried stuff like

char code = 0, excode = 0;
code = cin.get()
if (code == 27 && !cin.eof()) {
excode = cin.get();
code = cin.get();
}

, but that won't work, even if there is only the ESC character in stdin.

Is there another way to determine, whether the last character was read
from stdin? Am I doing anything wrong?

Thanks alot.
 
Reply With Quote
 
 
 
 
kwikius
Guest
Posts: n/a
 
      03-02-2007
On 2 Mar, 11:26, Johannes Meng <j...@jmeng.de> wrote:

First, I'm no expert on standard keryboard input in C++.

However AFAIK std::cin is quite primitive and only accepts ASCII
characters. The characters you want are extended ASCII AFAIK and a
quick test on win32 seems to suggest that standard input simply
ignores them.

Unfortunately the proper way forward I think, is to start
investigating a GUI toolkit. These firstly use a different paradigm
from the "input as file" paradigm of standard C++. This is the event
based program paradigm, in which your application sits idling and the
system fires events at it to which it responds. Typical events are
mouse move and keyboard events , and you then write functions to
describe what your application should do in response.

The simplest way to try some event based programming I would guess is
to use another language such as Java. C++ has ( nor probably will ever
have) much interest in standardisng a GUI.

regards
Andy Little



 
Reply With Quote
 
 
 
 
Johannes Meng
Guest
Posts: n/a
 
      03-02-2007
kwikius wrote:

> On 2 Mar, 11:26, Johannes Meng <j...@jmeng.de> wrote:
>
> First, I'm no expert on standard keryboard input in C++.
>
> However AFAIK std::cin is quite primitive and only accepts ASCII
> characters. The characters you want are extended ASCII AFAIK and a
> quick test on win32 seems to suggest that standard input simply
> ignores them.


Well, I don't know about win32, but here on linux, when, say, "arrow up" is
pressed, cin actually contains 27 91 65. Try the following:

#include <iostream>
using namespace std;

int main(int argc, char **argv)
{
string test;
cin >> test;

for (int i = 0; i < test.length(); i++) {
cout << (int)test[i] << " ";
}

cout << endl;

return 0;
}

If you start the programm, then press "arrow up" and then "enter", it should
output "27 91 65".

That means that the codes are there - I just need a way to determine whether
there's still something left in cin after reading a 27 (code for esc).

--
Johannes Meng
 
Reply With Quote
 
Johannes Meng
Guest
Posts: n/a
 
      03-02-2007
> kwikius wrote:
> The simplest way to try some event based programming I would guess is
> to use another language such as Java. C++ has ( nor probably will ever
> have) much interest in standardisng a GUI.


I just noticed I might not have been clear about what I want: I do _not_
want to program a gui. It's all about the command line

--
Johannes Meng
 
Reply With Quote
 
kwikius
Guest
Posts: n/a
 
      03-02-2007
On 2 Mar, 16:29, Johannes Meng <j...@jmeng.de> wrote:
<...>

> #include <iostream>
> using namespace std;
>
> int main(int argc, char **argv)
> {
> string test;
> cin >> test;
>
> for (int i = 0; i < test.length(); i++) {
> cout << (int)test[i] << " ";
> }
>
> cout << endl;
>
> return 0;
>
> }
>
> If you start the programm, then press "arrow up" and then "enter", it should
> output "27 91 65".


Aha . Works when I compile using gcc (in Windows) but in VC7.1 hangs
when I press arrow up) until I press an ascii character.

Not sure whether there is a right and wrong or if its implementaion
defined. I suspect implementation defined though.

The one common characteristic is that you have to press return to
flush the buffer and signal end of input AFAIK, before you can make
anything happen.

And to avoid that ( I think) you need to be able to monitor system
events ( e.g in a loop looking for e.g any new key pressed etc) which
isnt provided for in a standardised form in C++

Again though I'm no expert on this...

regards
Andy Little.




 
Reply With Quote
 
Alf P. Steinbach
Guest
Posts: n/a
 
      03-02-2007
* Johannes Meng:
>> kwikius wrote:
>> The simplest way to try some event based programming I would guess is
>> to use another language such as Java. C++ has ( nor probably will ever
>> have) much interest in standardisng a GUI.

>
> I just noticed I might not have been clear about what I want: I do _not_
> want to program a gui. It's all about the command line


*Dragging up memories from the eighties*

You probably need to do input at a lower, system-specific level because
you need a timeout.

You should check whether there's some library that translates escape
sequences to something more digestible, not sure if 'curses' does that.

--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
 
Reply With Quote
 
Johannes Meng
Guest
Posts: n/a
 
      03-02-2007
kwikius wrote:

> Aha . Works when I compile using gcc (in Windows) but in VC7.1 hangs
> when I press arrow up) until I press an ascii character.
>
> Not sure whether there is a right and wrong or if its implementaion
> defined. I suspect implementation defined though.
>
> The one common characteristic is that you have to press return to
> flush the buffer and signal end of input AFAIK, before you can make
> anything happen.
>
> And to avoid that ( I think) you need to be able to monitor system
> events ( e.g in a loop looking for e.g any new key pressed etc) which
> isnt provided for in a standardised form in C++
>
> Again though I'm no expert on this...


Thanks for testing! Well, I use unbuffered input, thus there's no need to
press enter. That works using some stuff from termios.h, which is most
probably linux/unix(?) specific, though.

--
Johannes Meng
 
Reply With Quote
 
Johannes Meng
Guest
Posts: n/a
 
      03-02-2007
Alf P. Steinbach wrote:

> *Dragging up memories from the eighties*


Hehe. That's about where I'm going ;P

>
> You probably need to do input at a lower, system-specific level because
> you need a timeout.
>
> You should check whether there's some library that translates escape
> sequences to something more digestible, not sure if 'curses' does that.


The thing is this: I'm currently coding an input prompt with bash-like
editing capabilities, history and so on. It's almost functional and really,
really small and I'd rather it didn't have any external dependencies. I'll
try looking for a suitable library anyways.

Thank you!

--
Johannes Meng
 
Reply With Quote
 
kwikius
Guest
Posts: n/a
 
      03-02-2007
On 2 Mar, 17:05, Johannes Meng <j...@jmeng.de> wrote:
> kwikius wrote:
> > Aha . Works when I compile using gcc (in Windows) but in VC7.1 hangs
> > when I press arrow up) until I press an ascii character.

>
> > Not sure whether there is a right and wrong or if its implementaion
> > defined. I suspect implementation defined though.

>
> > The one common characteristic is that you have to press return to
> > flush the buffer and signal end of input AFAIK, before you can make
> > anything happen.

>
> > And to avoid that ( I think) you need to be able to monitor system
> > events ( e.g in a loop looking for e.g any new key pressed etc) which
> > isnt provided for in a standardised form in C++

>
> > Again though I'm no expert on this...

>
> Thanks for testing! Well, I use unbuffered input, thus there's no need to
> press enter. That works using some stuff from termios.h, which is most
> probably linux/unix(?) specific, though.


Yes look like a Unix header to me:

http://www.opengroup.org/onlinepubs/...termios.h.html

regards
Andy Little


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
Determine start and end of DST by locale - client side mikepuglisi@gmail.com Javascript 0 07-18-2007 12:26 AM
nuby: determine method passed and determine the receiver that received the method Peņa, Botp Ruby 1 01-24-2004 07:51 PM
How to determine end-of-line sequence? J Krugman Perl Misc 4 12-18-2003 12:15 AM
What factor determine a session to end? Kian Goh ASP .Net 2 07-24-2003 09:06 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57