By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
445,750 Members | 1,199 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 445,750 IT Pros & Developers. It's quick & easy.

cin >> c

P: n/a
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/
Jul 22 '05 #1
Share this Question
Share on Google+
7 Replies


P: n/a
"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
kb******@gascad.at
Jul 22 '05 #2

P: n/a
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

Jul 22 '05 #3

P: n/a

"Kevin W." <co*****@in.sig> wrote in message
news:op**************@localhost.localdomain...
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
Jul 22 '05 #4

P: n/a
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." <co*****@in.sig> wrote in message news:<op**************@localhost.localdomain>...
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.

Jul 22 '05 #5

P: n/a
> 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/
Jul 22 '05 #6

P: n/a
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." <co*****@in.sig> wrote in message news:<op**************@localhost.localdomain>...
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.

Jul 22 '05 #7

P: n/a

"K Campbell" <ki****@cyrocom.co.uk> wrote in message
news:85**************************@posting.google.c 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
Jul 22 '05 #8

This discussion thread is closed

Replies have been disabled for this discussion.