Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оператор "запятая", особенности употребления 
V
    Опции темы
zim22
Дата 13.2.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Проблема в том, что cin >> ival при недопустимом значении(например ввода не числа, а строки) выполняется только при первой итерации цикла
В последующих итерациях просто происходит проверка условия на конец файла cin.eof(), число же не запрашивается с клавиатуры.
В чём проблема?

Код

int ival;
while ((cin >> ival, !cin.eof()))
{
    if (cin.fail())
    {
        std::cerr << "bad data, try again";
        cin.clear (std::istream::failbit);
        continue;
    }
    else
    {  
        std::cout << "OK, you value: " << ival << std::endl;  
    }
}



--------------------
PM MAIL   Вверх
mes
Дата 13.2.2009, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(zim22 @  13.2.2009,  12:22 Найти цитируемый пост)
while ((cin >> ival, !cin.eof()))


в данном контексте оператор "," нужно заменить на  "&&" (ведь необходимо же чтоб оба условия учитывались ?)

Это сообщение отредактировал(а) mes - 13.2.2009, 13:29


--------------------
PM MAIL WWW   Вверх
HappyLife
Дата 13.2.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: нет
Всего: 8



mes, уверен что "cin >>" bool ?
PM MAIL   Вверх
zim22
Дата 13.2.2009, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(mes @  13.2.2009,  13:28 Найти цитируемый пост)
в данном контексте оператор "," нужно заменить на  "&&" (ведь необходимо же чтоб оба условия учитывались ?)

Нет. Цикл необходим выполнять, пока не будет достигнут конец файла (комбинация клавиш CTRL+Z). 
Т.е. цикл должен продолжаться, если встречается некорректно введённое значение. Для этого я ж ведь и специальный  if (cin.fail()) написал. 
Извиняюсь также, я протупил (лишние круглые скобки вставил в while)
Должно быть так:
Код

while (cin >> ival, !cin.eof())

Т.е. сначала выполняется левый операнд оператора запятая, потом правый.
Но почему тогда cin только при первой итерации запрашивает с консоли ввод...




--------------------
PM MAIL   Вверх
bsa
Дата 13.2.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



zim22, во-первых, напиши лучше так:
Код
while( !(cin >> ival).eof() )
Имхо, это более понятно, чем с запятыми, так как далеко не все знают все тонкости работы оператора "запятая".
Во-вторых, ты "неправильные" данные из потока не извлек. Используй ignore().
PM   Вверх
Kallikanzarid
Дата 13.2.2009, 14:42 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: 2
Всего: 3



Достаточно написать while( cin >> var ), так как для потоков ввода определен оператор operator bool()
PM MAIL   Вверх
Dov
Дата 13.2.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(bsa @ 13.2.2009,  13:20)
zim22, во-первых, напиши лучше так:
Код
while( !(cin >> ival).eof() )
Имхо, это более понятно, чем с запятыми, так как далеко не все знают все тонкости работы оператора "запятая".
Во-вторых, ты "неправильные" данные из потока не извлек. Используй ignore().

Полностью поддерживаю..   smile

Добавлено через 5 минут и 31 секунду
и ещё:
Код
cin.clear (); // используй параметры по умолчанию
  


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
zim22
Дата 13.2.2009, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Kallikanzarid, я знаю, что можно написать условие, не используя оператор "запятая", но хочу именно с ним smile
bsa, спасибо за подсказку.

Вот так всё заработало:
Код
if (cin.fail())
{            
      std::cerr << "bad data, try again";                        
      cin.clear(std::istream::goodbit);            
      cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');            

      continue;
}

Хотя устанавливать бит goodbit вместо failbit в функции clear это изврат.
Ну подумайте сами. Я проверяю условие cin.fail()
Т.е. бит failbit в структуре iosstate был уже установлен в 1 (иначе мы не зашли бы в условие).
Затем вполне логично (для меня) очистить его функцией clear(std::istream::failbit), но никак не clear(std::istream::goodbit).

Но если я укажу cin.clear(std::istream::failbit), то состояние потока, которое можно проверить так:
Код

std::istream::iostate state = cin.rdstate();

будет отлично от нуля, т.е. ошибочно и при след.итерации мы снова зайдём в участок кода if (cin.fail()) {...}
-------
И вопрос не совсем по теме: как код обрамить в теги CODE чтобы он подсвечивался как С++ код. У меня получается с однострочным текстом, но не с многострочным...

Это сообщение отредактировал(а) zim22 - 13.2.2009, 15:27


--------------------
PM MAIL   Вверх
bsa
Дата 13.2.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



zim22, попробуй другой браузер и все будет в норме - у меня под оперой та же проблема. smile 
PM   Вверх
zim22
Дата 13.2.2009, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



bsa, заработало! internet explorer рулит! smile


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0778 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.