How to determine end of std::cin

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Johannes Meng

    How to determine end of std::cin

    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><C ODE>, 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.
  • kwikius

    #2
    Re: How to determine end of std::cin

    On 2 Mar, 11:26, Johannes Meng <j...@jmeng.dew rote:

    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



    Comment

    • Johannes Meng

      #3
      Re: How to determine end of std::cin

      kwikius wrote:
      On 2 Mar, 11:26, Johannes Meng <j...@jmeng.dew rote:
      >
      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

      Comment

      • Johannes Meng

        #4
        Re: How to determine end of std::cin

        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

        Comment

        • Alf P. Steinbach

          #5
          Re: How to determine end of std::cin

          * 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?

          Comment

          • kwikius

            #6
            Re: How to determine end of std::cin

            On 2 Mar, 16:29, Johannes Meng <j...@jmeng.dew rote:
            <...>
            #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.




            Comment

            • Johannes Meng

              #7
              Re: How to determine end of std::cin

              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

              Comment

              • Johannes Meng

                #8
                Re: How to determine end of std::cin

                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

                Comment

                • kwikius

                  #9
                  Re: How to determine end of std::cin

                  On 2 Mar, 17:05, Johannes Meng <j...@jmeng.dew rote:
                  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:



                  regards
                  Andy Little


                  Comment

                  Working...