![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| versus |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 8.3.2005 Где: Переславль-Залесс кий Репутация: нет Всего: 3 |
Всем привет.
Имеется вот такой код:
Как переписать его на С++ используя потоковую модель? Другими словами, как проверить что std::cin >> tmp прочитал то что нужно? |
|||
|
||||
| NiJazz |
|
||||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: 1 Всего: 23 |
Это сообщение отредактировал(а) NiJazz - 8.3.2005, 13:35 |
||||
|
|||||
| versus |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 8.3.2005 Где: Переславль-Залесс кий Репутация: нет Всего: 3 |
Боюсь что это не совсем то что мне нужно...
Вот как ведет себя C-шный вариант программы: versus@dot:$ ./a.out lala status: 0 versus@dot:$ ./a.out 10 status: 1 scanf возвращает количество успешно считанных (в смысле соотвествия форматной строке) аргументов. Исходя из этого количества можно, например, предпринять повторную попытку считать значение. Можно ли получить аналогичную информацию из cin ? Это сообщение отредактировал(а) versus - 8.3.2005, 13:45 |
|||
|
||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Может не в тему: ты как хочешь валидность ввода проверять?
|
|||
|
||||
| versus |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 8.3.2005 Где: Переславль-Залесс кий Репутация: нет Всего: 3 |
arajan, да мне бы хоть как нибудь... вот ведь scanf (из примера) как то может распознать что ему дают char вместо int.
Хорошо было бы если после чтения из потока переменная содержала бы какое-нибудь осмысленное значение своего типа, а в случае если ввод явно некорректный (например я жду double а мне суют char) сигнализировала об этом особым значением или каким-то иным образом. Ну не может быть что потоки не реализуют такую функциональность ! |
|||
|
||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
нет, потоки эту функциональность не реализиют... (я могу ошибаться...
где пишешь, среда разработки? попробуй конвертить в тип который тебе нужен, а при возникновении ошибки говори что ввод не правильный... так где пишешь? |
|||
|
||||
| versus |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 8.3.2005 Где: Переславль-Залесс кий Репутация: нет Всего: 3 |
g++ 3.3.5
похоже что в случае, когда cin читает значение не того типа, он просто не присваивает нового значения указанной справа переменной:
versus@dot:$ ./a.out lala 3 versus@dot:$ ./a.out 123 123 Это сообщение отредактировал(а) versus - 8.3.2005, 17:17 |
|||
|
||||
| np9mi7 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
ну так пиши так
и ваще, тебе какой тип нужно в итоге получить? говорю, можно так
Это сообщение отредактировал(а) arajan - 8.3.2005, 17:30 |
||||
|
|||||
| pablo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 12.2.2005 Где: Вильнюс, Литва Репутация: 4 Всего: 6 |
Корче говоря тот кусок кода который вы представили работает только один раз, т.е после выброса исключения поток ввода будет закрыт, а это не хорошо.
Если счтывание прозошло не удачно, то лучше явно выбросить исключение invalid_argument, перед этим отчистив поток для дальнейшего чтения. И кстати если вы обрабатываете есключения, то гораздо предпочтительнее здесь полиморфный подход, но это просто техническое замечание.
Вы ошибаетесь, причём очень. Для подобных приблем есть исключения. -------------------- Первый блин всегда похож на сферу, иногда бывает и куб. |
|||
|
||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
pablo, пример!!!
|
|||
|
||||
| pablo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 12.2.2005 Где: Вильнюс, Литва Репутация: 4 Всего: 6 |
Вот что я имел ввиду. -------------------- Первый блин всегда похож на сферу, иногда бывает и куб. |
|||
|
||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
согласен.... хотя, чето в VC я у CIN этого метода не нашел.... все это отмазы.... Это сообщение отредактировал(а) arajan - 8.3.2005, 22:32 |
|||
|
||||
| pablo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 12.2.2005 Где: Вильнюс, Литва Репутация: 4 Всего: 6 |
Ето не в VC, это стандартный способ выявления ошибок.
-------------------- Первый блин всегда похож на сферу, иногда бывает и куб. |
|||
|
||||
| np9mi7 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Да не про EXEPTIONS, а про cin.fail().......
Добавлено @ 22:38
Добавлено @ 22:40 хотя,
Б. Страуструп где правда Это сообщение отредактировал(а) arajan - 8.3.2005, 22:41 |
||||
|
|||||
| versus |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 8.3.2005 Где: Переславль-Залесс кий Репутация: нет Всего: 3 |
pablo, спасибо!
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |