Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Проверка допустипости потока  (Прочитано 327 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Санчо42

  • Автор темы
  • Активист
  • *
  • Сообщений: 424
    • Просмотр профиля
Проверка допустипости потока
« : 10 Февраль 2014, 23:07:51 »
Подскажите, почему поток считается допустимым в одном случае (как следствие while выполняется) и недопустим в другом?
Случай первый
Код: C
  1. #include <iostream>
  2. #include <string>
  3.  
  4. int main()
  5. {      
  6.         std::string sum;
  7.         while (std::string >> sum)
  8.         std::cout << "ok " << std::endl; //отправляем в поток 1 1 1 р, получаем на выходе четыре раза ок и ожидание ввода
  9.         return 0;
Случай второй
Код: C
  1. #include <iostream>
  2. #include <string>
  3.  
  4. int main()
  5. {      
  6.         int sum;
  7.         while (std::cin >> sum)
  8.         std::cout << "ok " << std::endl; //отправляем в поток 1 1 1 р, получаем на выходе три раза ок и закрытие проги
  9.         return 0;
В обоих случаях оператор >> возвращает свой левый операнд - поток, и в обоях случаях в поток отправляются одинаковые данные, но во втором случает символ "р" в потоке считается недопустимым, и цикл прерывается
« Последнее редактирование: 10 Февраль 2014, 23:29:31 от Санчо42 »
Asus K55DR  AMD A-10 (HD7660+HD7470) 6Gb/1Tb

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 11890
  • Xubuntu 18.04 (64bit)
    • Просмотр профиля
Re: Проверка допустипости потока
« Ответ #1 : 10 Февраль 2014, 23:11:43 »
 :idiot2: а символ p - это русская эр или латинская пэ?
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн Санчо42

  • Автор темы
  • Активист
  • *
  • Сообщений: 424
    • Просмотр профиля
Re: Проверка допустипости потока
« Ответ #2 : 10 Февраль 2014, 23:12:43 »
Это латинска рэ, а разница есть? имею ввиду, что вслед на цифрами в поток отправляется буква.
Asus K55DR  AMD A-10 (HD7660+HD7470) 6Gb/1Tb

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7080
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Проверка допустипости потока
« Ответ #3 : 10 Февраль 2014, 23:16:59 »
Санчо42, сравни:
Код: C++
  1. std::string sum;
Код: C++
  1. int sum;
Какие данные корректны для одной переменной, а какие для другой?

Оффлайн Санчо42

  • Автор темы
  • Активист
  • *
  • Сообщений: 424
    • Просмотр профиля
Re: Проверка допустипости потока
« Ответ #4 : 10 Февраль 2014, 23:21:18 »
peregrine,
Да, для int буковы не верны, но логика, по-моему, должна быть такой: как я уже написал выше, оператор >> возвращает свой левый операнд - поток ввода. После попытки записать в int неверное для него значение, оператор должен вернуть пустой поток, который по идее дает истину (как в первом случае со стрингом) и прога должна вернуть четвертый ок и ожидать дальнейших данных или EOF

вычитал из C++ Primer 4 Ed. Липмана
« Последнее редактирование: 10 Февраль 2014, 23:24:11 от Санчо42 »
Asus K55DR  AMD A-10 (HD7660+HD7470) 6Gb/1Tb

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7080
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Проверка допустипости потока
« Ответ #5 : 11 Февраль 2014, 00:25:29 »
Санчо42, неа, логика тут такая:
Посылаем 1, хорошо, посылаем ещё одну - хорошо, посылаем ещё - хорошо, посылаем букву - плохо, на поток badbit, failbit и мусор в потоке, который в переменную не отправился. Так и делают контроль ввода ошибочных данных.

Оффлайн Санчо42

  • Автор темы
  • Активист
  • *
  • Сообщений: 424
    • Просмотр профиля
Re: Проверка допустипости потока
« Ответ #6 : 11 Февраль 2014, 00:29:16 »
peregrine,
А что же тогда будет в первом случае? Посылаем 1, хорошо, посылаем ещё одну - хорошо, посылаем ещё - хорошо, посылаем букву - и вдруг тоже стало хорошо? Что изменилось?
Asus K55DR  AMD A-10 (HD7660+HD7470) 6Gb/1Tb

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7080
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Проверка допустипости потока
« Ответ #7 : 11 Февраль 2014, 00:34:38 »
Санчо42, тип переменной, в ней буквы хранить можно.

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 715
    • Просмотр профиля
Re: Проверка допустипости потока
« Ответ #8 : 11 Февраль 2014, 10:53:29 »
Обычно пользовательский ввод делают в string, а уже из него достают числа. Там и проверки, и все, что хочешь.

Оффлайн Санчо42

  • Автор темы
  • Активист
  • *
  • Сообщений: 424
    • Просмотр профиля
Re: Проверка допустипости потока
« Ответ #9 : 11 Февраль 2014, 15:37:30 »
peregrine,
Буквы хранить можно, но ведь содержимое потока остается прежним! В первом случае: сдвинули данные из потока в переменную, проверили допустимость потока - ок. Во втором случае: сдвинули данные из потока в переменную (пусть преобразование не сработает), проверили допустимость потока (он не изменился с первого случая) - но он оказался недопустип. Почему - ведь потоки в обоих случаях неизменны!
Asus K55DR  AMD A-10 (HD7660+HD7470) 6Gb/1Tb

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7080
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Проверка допустипости потока
« Ответ #10 : 11 Февраль 2014, 17:25:17 »
Санчо42, потому, что при присвоении переменной произошла ошибка и на поток установился Failbit и Badbit, содержимое потока (как ошибка началась) никуда не сместилось, а так и осталась в потоке, так как не происходит никакого смещения, а происходит копирование и удаление скопированного покусочкам.

 

Страница сгенерирована за 0.068 секунд. Запросов: 24.