Класс istream определяется так:

class istream (* // ... public: istream amp; operator»»(char*); // строка istream amp; operator»»(char amp;); // символ istream amp; operator»»(short amp;); istream amp; operator»»(int amp;); istream amp; operator»»(long amp;); istream amp; operator»»(float amp;); istream amp; operator»»(double amp;); // ... *);

Функции ввода определяются в таком духе:

istream amp; istream::operator»»(char amp; c); (* // пропускает пропуски int a; // неким образом читает символ в "a" c = a; *)

Пропуск определяется как стандартнчй пропуск в C, через вызов isspase() в том виде, как она определена в «ctype.h» (пробел, табуляция, символ новой строки, перевод формата и возврат каретки).

В качестве альтернативы можно использовать функции get():

class istream (* // ... istream amp; get(char amp; c); // char istream amp; get(char* p, int n, int ='\n'); // строка *);

Они обрабатывают символы пропуска так же, как остальные символы. Функция istream::get(char) читает один символ в свой параметр; другая istream::get читает не более n символов в вектор символов, начинающийся в p. Необязательный третий праметр используется для задания символа остановки (иначе, терминатора или ограничителя), то есть этот символ читаться не будет. Если будет встречен символ ограничитель, он остнется как первый символ потока. По умолчанию вторая функция get будет читать самое большее n символов, но не больше чем одну строку, '\n' является ограничителем по умолчанию. Необзательный третий параметр задает символ, который читаться не будет. Например:

cin.get(buf,256,'\t');

будет читать в buf не более 256 символов, а если встртится табуляция ('\t'), то это приведет к возврату из get. В этом случае следующим символом, который будет считан из cin, будет '\t'.

Стандартный заголовочный файл «ctype.h» определяет неколько функций, которые могут оказаться полезными при осществлении ввода:

int isalpha(char) // 'a'..'z' 'A'..'Z' int isupper(char) // 'A'..'Z' int islower(char) // 'a'..'z' int isdigit(char) // '0'..'9' int isxdigit(char) // '0'..'9' 'a'..'f' 'A'..'F' int isspase(char) // ' ' '\t' возврат новая строка // перевод формата int iscntrl(char) // управляющий символ // (ASCII 0..31 и 127) int ispunct(char) // пунктуация:ни один из вышеперечисленных int isalnum(char) // isalpha() ! isdigit() int isprint(char) // печатаемый: ascii ' '..'-' int isgraph(char) // isalpha() ! isdigit() ! ispunct() int isascii(char c) (* return 0«=c amp; amp; c«=127; *)

Все кроме isascii() реализуются внешне одинаково, с прменением символа в качестве индекса в таблице атрибутов символов. Поэтому такие выражения, как

(('a'«=c amp; amp; c«='z') !! ('A'«=c amp; amp; c«='Z')) // алфавитный

не только утомительно пишутся и чреваты ошибками (на мшине с набором символов EBCDIC оно будет принимать неалфавиные символы), они также и менее эффективны, чем применение стандартной функции:

isalpha(c)