Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > cin >> c

Reply
Thread Tools

cin >> c

 
 
Kevin W.
Guest
Posts: n/a
 
      08-23-2004
I'm writing a simple Unix console app. I need to take an input of a
single character from the user and discard the rest.

If I have:
char c;
cin >> c;
And the user types the letter 'a', then presses Enter, 'a' gets put into c
as I want. BUT, Enter remains as the next character in the stream, so if
I then do a getline(cin, word), I get an empty string in word. The other
requirement I need is that if the user just presses Enter without entering
a letter, c should be assigned to '\n'.

Ideally, it should process the character (whatever it is) without the user
having to press Enter.

--
Kevin W
Opera/CSS/webdev blog: http://www.exclipy.com/
Using Opera: http://www.opera.com/m2/
 
Reply With Quote
 
 
 
 
Karl Heinz Buchegger
Guest
Posts: n/a
 
      08-23-2004
"Kevin W." wrote:
>
> I'm writing a simple Unix console app. I need to take an input of a
> single character from the user and discard the rest.
>
> If I have:
> char c;
> cin >> c;
> And the user types the letter 'a', then presses Enter, 'a' gets put into c
> as I want. BUT, Enter remains as the next character in the stream, so if
> I then do a getline(cin, word), I get an empty string in word. The other
> requirement I need is that if the user just presses Enter without entering
> a letter, c should be assigned to '\n'.


The simplest thing to fulfill your requirement is to use getline
for entering that single character too. Just use the first character
of the read line and be done with it. If what you read is an empty
line, then just assume 'c' was pressed.

Doing the above is often one of the simplest solutions to most
input problems:

just read a complete line as a string and use from that line
whatever you need. This also may mean to convert things on your
own or to extract the things you need from the input line as
required.

>
> Ideally, it should process the character (whatever it is) without the user
> having to press Enter.


Not possible with standard C++

--
Karl Heinz Buchegger
http://www.velocityreviews.com/forums/(E-Mail Removed)
 
Reply With Quote
 
 
 
 
Joe Hotchkiss
Guest
Posts: n/a
 
      08-23-2004
Kevin W. wrote:
> Ideally, it should process the character (whatever it is) without the
> user having to press Enter.


This would require changing the attributes of the input device. Something
like 'raw' input or disabling canonical mode input processing, which would be
arranged using ioctl or stty or some such. I think you would first have to
find out what device you are receiving your standard input from. It's a while
since I used UNIX so I can't be very specific I'm afraid. You should do
better asking in a UNIX newsgroup.

--
Regards,

Joe Hotchkiss,
http://joe.hotchkiss.com

XXXXXXXXXXXXXXXXXXXXXXXXX
X joe.hotchkiss X
X at baesystems.com X
XXXXXXXXXXXXXXXXXXXXXXXXX



 
Reply With Quote
 
Mike Wahler
Guest
Posts: n/a
 
      08-23-2004

"Kevin W." <(E-Mail Removed)> wrote in message
news(E-Mail Removed)...
> I'm writing a simple Unix console app. I need to take an input of a
> single character from the user and discard the rest.
>
> If I have:
> char c;
> cin >> c;
> And the user types the letter 'a', then presses Enter, 'a' gets put into c
> as I want. BUT, Enter remains as the next character in the stream, so if
> I then do a getline(cin, word), I get an empty string in word. The other
> requirement I need is that if the user just presses Enter without entering
> a letter, c should be assigned to '\n'.


char c(0);
std::string word;
std::getline(std::cin, word);
c = (word + '\n')[0];

> Ideally, it should process the character (whatever it is) without the user
> having to press Enter.


Not possible with standard C++.

-Mike


 
Reply With Quote
 
John Pazarzis
Guest
Posts: n/a
 
      08-23-2004
Using Windows Specific libraries can be done like this:

#include <iostream>
#include <string>
#include <conio.h>

void main( void )
{
std::string strg = "";
for(char ch = 0; ch != ' '; ch = _getch(),strg += ch);
std::cout << strg << std::endl;
}


"Kevin W." <(E-Mail Removed)> wrote in message news:<(E-Mail Removed)>...
> I'm writing a simple Unix console app. I need to take an input of a
> single character from the user and discard the rest.
>
> If I have:
> char c;
> cin >> c;
> And the user types the letter 'a', then presses Enter, 'a' gets put into c
> as I want. BUT, Enter remains as the next character in the stream, so if
> I then do a getline(cin, word), I get an empty string in word. The other
> requirement I need is that if the user just presses Enter without entering
> a letter, c should be assigned to '\n'.
>
> Ideally, it should process the character (whatever it is) without the user
> having to press Enter.

 
Reply With Quote
 
Kevin W.
Guest
Posts: n/a
 
      08-24-2004
> The simplest thing to fulfill your requirement is to use getline
> Just use the first character of the read line and be done with it.


Thanks.

--
Kevin W
Opera/CSS/webdev blog: http://www.exclipy.com/
Using Opera: http://www.opera.com/m2/
 
Reply With Quote
 
K Campbell
Guest
Posts: n/a
 
      08-24-2004
Try doing this:
char c;
cin>>c;
cin.ignore();
cin.getline(name, int);

or, if you want to just capture one character, without the user having
to press enter:
(you must #include <conio.h>)
char c = getch();
cin.getline(name, int);

Hope i've been of some help.
Kieran





"Kevin W." <(E-Mail Removed)> wrote in message news:<(E-Mail Removed)>...
> I'm writing a simple Unix console app. I need to take an input of a
> single character from the user and discard the rest.
>
> If I have:
> char c;
> cin >> c;
> And the user types the letter 'a', then presses Enter, 'a' gets put into c
> as I want. BUT, Enter remains as the next character in the stream, so if
> I then do a getline(cin, word), I get an empty string in word. The other
> requirement I need is that if the user just presses Enter without entering
> a letter, c should be assigned to '\n'.
>
> Ideally, it should process the character (whatever it is) without the user
> having to press Enter.

 
Reply With Quote
 
Mike Wahler
Guest
Posts: n/a
 
      08-24-2004

"K Campbell" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed) om...
> Try doing this:
> char c;
> cin>>c;
> cin.ignore();


This will extract and discard the first of possibly
several characters following the one that gets extracted
and stored in 'c'. E.g. if I input "abc", character 'a'
gets put into 'c', character 'b' is thrown away, and character
'c' remains in the stream. You can give an argument of
'std::numeric_limits<std::streamsize>::max()' to 'ignore()',
and it will ignore all pending characters, not just the first.

> cin.getline(name, int);
>
> or, if you want to just capture one character, without the user having
> to press enter:
> (you must #include <conio.h>)


Not a standard C++ header. Please don't post such things here.

> char c = getch();


Not a standard C++ function. Please don't post such things here.


> cin.getline(name, int);
>
> Hope i've been of some help.


Hmm.

-Mike


 
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
Using cin.get() and cin.eof() ends up in an endless loop Fernando C++ 4 11-16-2011 07:19 PM
Java equivalent of cin Gregory W. Ernest Java 3 08-03-2008 03:16 AM
cin and cin.getline() Aleander C++ 5 03-06-2005 03:57 PM
std::cin.ignore() and std::cin.clear() Chris Mantoulidis C++ 5 01-06-2004 11:08 PM
cin and cin.clear() problem TaiwanNoWhere C++ 8 10-17-2003 05:53 PM



Advertisments