ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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 и тем самым сгенерирован признак ошибки. После этого

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

так, чтобы экран не прокручивался.

 

15