ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 12) онлайн
Ввод при отсутствии данных
Символы, не несущие смысловой нагрузки, — пробелы и '\n' — обычно пропуска-
ются при вводе данных. Это может привести к некоторым нежелательным по-
бочным эффектам. Например, пользователи вместо ввода значения могут просто
случайно нажать Enter, думая, что тем самым введут ноль, или просто запутав-
шись. Приведенный выше код также, как и выражение
cin >> i;
после нажатия клавиши Enter приведет к переводу курсора на новую строку, в то
время как поток все еще будет ожидать ввода данных. В чем проблема с перево-
дом курсора на новую строку? Дело в том, что, не увидев адекватной реакции на
свои действия, пользователь может подумать, что компьютер вышел из строя.
Кроме того, обычно повторные нажатия клавиши Enter приводят к тому, что курсор
сдвигается все ниже и ниже, пока не дойдет до конца экрана, после чего экран
начинает прокручиваться вверх. Хорошо еще, если пользователь и программа
взаимодействуют в этаком телеграфном стиле, просто печатая друг другу сооб-
щения. Но если нечто подобное произойдет в программе, в которой используется
графика, основанная на тексте (как в программе ELEV из главы 13 «Многофайло-
вые программы»), прокручивание окна приведет к полной неразберихе на экране.
Таким образом, важно иметь возможность дать команду входному потоку
не игнорировать разделители. Это делается с помощью флага skipws:
cout << "\nВведите целое число: ";
cin.unsetf(ios::skipws);//не игнорировать разделители
cin >> i;
if( cin.good() )
{
//ошибок нет
}
//ОШИБКА!
Уж теперь если пользователь и нажмет Enter, забыв ввести данные, то будет
установлен флаг failbit и тем самым сгенерирован признак ошибки. После этого
можно попросить пользователя ввести данные повторно или перемещать курсор
так, чтобы экран не прокручивался.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48