Форум программистов, компьютерный форум CyberForum.ru

Что делает cin.get - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.67
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
20.09.2012, 21:18     Что делает cin.get #1
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int main()
{
    int a;
    std::cin >> a; 
    std::cin.putback ('A');
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    std::cout << std::cin.get() << std::endl;
    system ("pause");
    return 0;
}
Почему он не выводит код буквы А? Как я думаю, если ввести сначала "1234i", cin прочтет 1234 и останется буква i. Затем в поток к букве i и переводу строки в ней, добавится буква А. Потом, ignore сотрет все символы вместе с '\n' и останется одна А, которую cin.get и должен вывести (ее код).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
20.09.2012, 21:21     Что делает cin.get #2
c чего вы взяли, что он должен вывести ее код?
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
20.09.2012, 21:23  [ТС]     Что делает cin.get #3
panicwassano, http://www.cplusplus.com/reference/i...m/istream/get/
int get();
Extracts a character from the stream and returns its value (casted to an integer).
Venzo
 Аватар для Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
20.09.2012, 21:28     Что делает cin.get #4
C++
1
std::numeric_limits<std::streamsize>::max()
подозреваю, что должно быть ::min()
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
20.09.2012, 21:34  [ТС]     Что делает cin.get #5
ZoRT, да, так работает. Спасибо. А почему именно так?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.09.2012, 21:35     Что делает cin.get #6
Dani, после некорректного ввода в переменную а, в потоке устанавливается бит failbit. Дальнейшие операции над потоком нельзя проводить, пока не будет выполнен std::istream::clear.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
20.09.2012, 21:42  [ТС]     Что делает cin.get #7
Toshkarik, буква вместо разделителя (в данном случае), я правильно понял?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.09.2012, 21:49     Что делает cin.get #8
Тип переменной - int. Символы, кроме цифр, пробела, минуса или новой строки считаются за ошибку ввода.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
20.09.2012, 21:52  [ТС]     Что делает cin.get #9
Toshkarik, а почему, даже без cin.clear, поменяв
C++
1
std::numeric_limits<std::streamsize>::max()
на
C++
1
std::numeric_limits<std::streamsize>::min()
, оно заработало?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.09.2012, 21:56     Что делает cin.get #10
Dani, если честно, то понятия не имею. Возможно UB.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
20.09.2012, 21:57  [ТС]     Что делает cin.get #11
Toshkarik, и совсем для нуба, что такое UB?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.09.2012, 21:58     Что делает cin.get #12
Undefined behavior
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
20.09.2012, 21:59  [ТС]     Что делает cin.get #13
Да, и если поставить cin.clear и вместо ::min ::max - оно не работает)
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
20.09.2012, 22:02     Что делает cin.get #14
при вводе 1234i в буфере останется "i\n", приём гетпоинтер будет на букве i и cin.fail() будет true. putback() декрементит гетпоинтер и вставляет 'A', в буфере будет "Ai\n".
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
20.09.2012, 22:06  [ТС]     Что делает cin.get #15
igorrr37, а почему такой код выводит 65?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
int main()
{
    int a;
    std::cin >> a; 
    std::cin.putback ('A');
    std::cout << std::cin.failbit  << std::endl;
    //std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::min(), '\n');
    std::cout << std::cin.get() << std::endl;
    system ("pause");
    return 0;
}
Venzo
 Аватар для Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
20.09.2012, 22:10     Что делает cin.get #16
Цитата Сообщение от Dani Посмотреть сообщение
igorrr37, а почему такой код выводит 65?
вроде получается он ничего не удаляет из потока и выйдет тоже, что без строки с cin.ignore
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
20.09.2012, 22:12  [ТС]     Что делает cin.get #17
И почему, если заменить
C++
1
std::numeric_limits<std::streamsize>::min()
на
C++
1
std::numeric_limits<std::streamsize>::max()
, оно просит сделать еще ввод? Удалило все символы, получается?
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
20.09.2012, 22:26     Что делает cin.get #18
std::numeric_limits<std::streamsize>::min() - число отрицательное, ignore() с ним ничего не игнорит
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.09.2012, 22:28     Что делает cin.get #19
Получается, что 'A' попадает перед 'i'.
Миниатюры
Что делает cin.get  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2012, 22:38     Что делает cin.get
Еще ссылки по теме:

C++ Продемонстрировать различие между вводом с помощью cin.Get и cin.Getline с тремя параметрами
Что делает метод cin.ignore? C++
C++ Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear()

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.09.2012, 22:38     Что делает cin.get #20
Цитата Сообщение от Toshkarik Посмотреть сообщение
Dani, после некорректного ввода в переменную а, в потоке устанавливается бит failbit. Дальнейшие операции над потоком нельзя проводить, пока не будет выполнен std::istream::clear.
Как ни странно, делаю после cin >> a; cout << cin.fail(), выводит 0, как будто никакой ошибки не было.
Yandex
Объявления
20.09.2012, 22:38     Что делает cin.get
Ответ Создать тему
Опции темы

Текущее время: 16:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru