Очистка ввода cin: разве cin.ignore не является хорошим способом? - PullRequest
8 голосов
/ 04 апреля 2010

Что может быть лучше для очистки cin ввода? Я думал, cin.clear и cin.ignore - это хороший способ?

Код:

 void clearInput()
{   
    cin.clear();
    cin.ignore(1000,'\n');
    //cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );

}

Мой учитель дал мне этот ответ:

это в основном говорит, что ваш clearInput не работает К вашему сведению: игнорировать НИКОГДА не хорошая идея как способ избавиться от всего, что остается на линия

и вы провалили этот тест причина, почему теперь ясно правильный путь

Она также сказала мне следующее:

при игнорировании нужно угадать как много символов, которые вы хотите игнорировать, если Вы абсолютно знаете свои данные и это следует строгому формату - как в Excel электронные таблицы, игнорировать это действительно хорошо. Если вы НЕ в этом типе файла, тогда вы НИКОГДА не используете игнорировать. Вопрос, ваши данные правильно сформированы? Если да, используйте игнорировать. Если нет, не используйте игнорировать.

Перечислите ВСЕ способы получения данных? 1) есть добыча >>

а есть еще ??????

пожалуйста, укажите для меня

Ответы [ 2 ]

5 голосов
/ 04 апреля 2010

Копирование-вставка из стандарта,

basic_istream<charT,traits>&
ignore(streamsize n = 1, int_type
delim = traits::eof());

Эффекты: Ведет себя как неформатированный функция ввода (как описано в 27.6.1.3, пункт 1). После постройки сторожевого объекта, извлекает персонажей и отбрасывает их. Символы извлекаются до тех пор, пока происходит следующее:

  • если n != numeric_limits<streamsize>::max() (18.2.1), извлекаются n символов
  • конец файла встречается во входной последовательности (в этом случае функция звонки setstate(eofbit), которые могут бросок ios_base::failure (27.4.4.3));
  • c == delim для следующего доступного входного символа c (в этом случае c экстрагируют). * * тысячу двадцать-одна

Вы прокомментировали строку с numeric_limits<>::max выше, но похоже, что вы не хотели использовать что-то, что вы не совсем поняли, что тоже хорошо.

Единственное, что кто-то может захотеть, кроме ignore, - это неблокирующее поведение, то есть не ждите, пока пользователь нажмет return, если терминал находится в небуферизованном режиме. Насколько я знаю, это просто не поддерживается iostreams.

4 голосов
/ 04 апреля 2010

Ответ вашего учителя немного неясен (по крайней мере, для меня).

Что касается ignore, ваш учитель в принципе неправ: ignore - это стандартная идиома о том, как очистить поток (как показано Potatocorn, это даже упоминается в стандарте). 1007 *

Однако важно отметить, что cin.ignore(1000) действительно действительно плохой способ сделать это: это просто предполагает, что в буфере не будет более 1000 символов. Никогда не используйте такое магическое число в ignore.

Вместо этого либо используйте

  1. cin.rdbuf()->in_avail() (т.е. доступное количество символов в буфере чтения) 1) или используйте
  2. numeric_limits<streamsize>::max().

1) К сожалению, in_avail не работает на некоторых последних компиляторах VC (?), Поэтому этот метод не очень переносим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...