    Запустите FILTER по аналогии с другими программами-фильтрами, переназначив 
ввод-вывод командой DOS. Например, чтобы FILTER отобразила свой исходный 
текст, введите команду DOS filter <filter.cpp. Для переназначения консольного 
вывода на принтер следует ввести filter >prn. Для того чтобы распечатать файл, 
введите filter <filename.ext >prn. 
    Строка 7 в FILTER.СРР вызывает cin.get(c) для ввода символа. Выражение 
cin.get(c) возвращает значение типа int или нуль при достижении конца 
источника ввода. Строка 8 передает все символы из источника в стандартный вывод. 

    Чтение данных встроенных типов 

    Самая привлекательная черта библиотеки потоков ввода-вывода C++ — чтение и 
запись данных самых различных типов. Листинг 12.4 демонстрирует чтение данных 
целых и вещественных типов с помощью операторов библиотеки потоков. 
Скомпилируйте и запустите программу как Easy Win-приложение для Windows или 
как DOS-программу и введите запрашиваемые значения. Попробуйте ввести ошибки 
(например, XXX вместо вещественного значения) для того, чтобы увидеть, как 
программа их обрабатывает. 

    Листинг 12.4.    GETVAL.CPP (использование библиотеки потоков ввода-вывода 
для чтения данных встроенных типов) 

    1:	#include <iostream.h> 
    2:	#include <stdlib.h> 
    3: 
    4:	void test(void); 
    5: 
    6:	main() 
    7:	{ 
    8:	  double fp;  // Вещественное значение 
    9:	  long k;  // Длинное целое 10: 
    11:	  cout « "Enter a floating-point value:   "; 
    12:	  cin » fp; 
    13:	  test(); 
    14:	  cout « "Value entered is:   " « fp «  '\n'; 
    15:	  cout « "Enter an integer value:   "; 
    16:	  cin » k; 
    17:	  test(); 
    18:	  cout « "Value entered is:   " « k «  '\n'; 
    19:	  return 0; 
    20:	} 
    21: 
    22:	void test(void) 
    23:	{ 
    24:	  if (!cin.good()) { 
    25:	    cout « "Error detected"; 
    26:	    exit(1); 
    27:	  } 
    28:	}

    Строка 11 запрашивает вещественное значение, читая его оператором 
потокового ввода в переменную fp типа double в строке 12. Аналогичный оператор 
ввода в строке 16 читает целое значение. В отличие от стандартного 
ввода-вывода, который требует точно задавать типы данных в функции scanfO или 
вызывать функции, которые могут читать и преобразовывать нестандартные типы, 
потоки ввода-вывода автоматически определяют тип переменных, используемых в 
операциях ввода-вывода. Поскольку вам не обязательно точно указывать типы 
данных, вы не сделаете ошибку в указании типа, как это могло бы быть при 
использовании стандартного ввода-вывода. В C++ очень сложно ввести в 
переменную данные неверного типа! 
    Строки 13 и 17 демонстрируют еще одно важное достоинство потоков 
ввода-вывода. Эти строки вызывают локальную функцию testO, приведенную в 
строках 22-28. 
    Функция проверяет результат вызова cin.good() — функции-члена, которая 
возвращает TRUE, если не было неисправимых ошибок для указанного потока. Можно 
использовать cout. good() точно так же и для выходного потока. В приведенном 
примере программы, если cin.good() возвращает FALSE, строки 25-26 выводят 
сообщение и завершают выполнение программы. 
    Вы не должны останавливать программу при обнаружении ошибки. Для сброса 
состояния ошибки следует использовать оператор 

    cin.clear(); 

    В главе 15 будут приведены другие функции-члены библиотеки потоков ввода-вывода. 


    Глава 12. Введение в C++	283 
