cin >> c

K

Kevin W.

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

Karl Heinz Buchegger

Kevin W. said:
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++
 
J

Joe Hotchkiss

Kevin said:
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
 
M

Mike Wahler

Kevin W. said:
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
 
J

John Pazarzis

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

K Campbell

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
 
M

Mike Wahler

K Campbell said:
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
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,011
Latest member
AjaUqq1950

Latest Threads

Top