2015-05-03 2 views
0

Мой вопрос кажется таким же, как this one, но я не нашел ответа, так как исходный вопрос, похоже, задал более конкретный вопрос. В C++ 98, какова разница междуРазница между istream :: get (char &) и оператор >> (char &)

char c; 
cin.get(c); 

и

char c; 
cin >> c; 

?

Я проверил ссылку cplusplus для get и operator>>, и они выглядят одинаково для меня.

Я пробовал код выше, и они, похоже, ведут себя одинаково при вводе символа.

+1

Действительно, существует перегрузка ['operator >>'] (http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt2), которая принимает только один символ. –

+2

Дело в том, что это [не-членская перегрузка] (http://www.cplusplus.com/reference/istream/istream/operator-free/) – Unda

+0

@HaochenWu Не совсем, оба возвращают ссылку на поток. –

ответ

4

Разница зависит от того, существует ли пробельный символ в буфере потока.

Рассмотрим ввод 'Foo'

char c; 
cin.get(c); 

Сбережет ' ' в с

Однако

char c; 
cin >> c; 

будет пропускать пробелы и хранить 'f' в с

1

В дополнение к что уже было сказано, std::istream::get() также является неформатированной входной функцией, поэтому влияет на поток gcount(), в отличие от форматированного экстрактора. Большинство перегрузок get() и getline() в основном были сделаны обременением путем введения std::string, его экстракторов потока и std::getline(). Я бы сказал, чтобы использовать std::istream::get() всякий раз, когда вам нужен одиночный, неформатированный символ прямо из буфера (с использованием его одиночной или нулевой перегрузки аргументов). Это, конечно, быстрее, чем отключить пропуски пробелов перед использованием форматированного экстрактора. Также используйте std::string вместо необработанных буферов символов и is >> str для форматированных данных или std::getline(is, str) для неформатированных данных.

Смежные вопросы