|
Программирование >> Структурное программирование
умолчанию параметр функции clear принимает значение ios::goodbit, так что оператор cin.clear(); ОЧИСТИТ входной поток cin и установит goodbit для этого потока. Оператор cin.clear (ios::failbit) устанавливает failbit. Пользователь может захотеть сделать это, если столкнется с проблемами при обработке cin с типом, определенным пользователем. Имя функции clear не кажется подходящим в этом контексте, но подобное применение clear вполне корректно. Программа, приведенная на рис. 11.29, демонстрирует применение функций-элементов rdstate, eof, fail, bad, good и clear. Функция-элемент operator! возвращает истину в том случае, если установлен либо badbit, либо failbit, либо оба вместе. Функция-элемент operator void * возвращает false, если установлен либо badbit, либо failbit, либо оба вместе. Эти функции полезны при обработке файлов и проверке истинности или ложности условия в структуре выбора или в структуре повторения. 11.9. Ввод-вывод определенных пользователем типов данных в языке С-Н- предусмотрена возможность вводить и выводить данные стандартных типов, используя операции взять из потока и операции поместить в поток . Эти операции перегружены для обработки любых данных стандартного типа, включая строки и адреса памяти. Программист может перегрузить операции поместить в поток и взять из потока для выполнения ввода-вывода данных, тип которых определен пользователем. Программа, приведенная на рис. 11.30, демонстрирует перегрузку операций взять из потока и поместить в поток для обработки определенного пользователем класса, названного PhoneNumber и содержащего номера телефонов. Заметим, что эта программа предполагает правильный ввод телефонных номеров. Мы оставим на упражнения поиск ошибок этого ввода. Операция взять из потока принимает в качестве параметров ссылку на istream, ссылку на определенный пользователем тип данных (в нашем случае - PhoneNumber) и возвращает ссылку на istream. На рис. 11.30 демо-стрируется перегруженная операция взять из потока, которая используется для ввода номеров телефонов в виде (800) 555-1212 В объекты типа PhoneNumber, Функция-операция считывает три части телефонного номера в элементы areaCode, exchange и line объекта типа PhoneNumber (объект num в функции-операции и объект phone в функции main). Круглые скобки, пробел и символ дефиса отбрасываются с помощью вызова функции-элемента ignore класса istream. Функция-операция возвращает ссылку на input класса istream. С помощью возвращения ссылки на поток операция ввода объектов типа PhoneNumber может быть сцеплена с операцией ввода другого объекта типа PhoneNumber или какого-то другого типа данных. Например, два объекта типа PhoneNumber могли быть введены следующим образом: cin >> phonel >> phone2; figll 29.cpp Проверка состояний ошибок. iinclude <iostream.h> main() mt x; cout << До ошибочной операции ввода: << endl << cin.rdstate () cin.eof 0: cin. fail 0 cin.bad 0 : cin.good 0 : cin.rdstate() endl cin.eof 0 endl cin. fail 0 endl cin.badO endl << cin.good() endl << endl << Ожидается целое, но вводится символ: cin>>x; cout << endl << После ошибочной операции ввода: << endl << << cin.rdstateО : cin.rdstate() << endl cin.eof 0 : cin.eof () endl cin. fail 0 : cin. fail () endl cin.badO: cin.badO <<endl cin.goodO: cin. good {) endl endl; cin.clear(); cout << После cin.clear(): << endl cin. fail (): cin. fail () endl cin.goodO: cin.goodO endl endl; return 0; До ошибочной операции ввода: cin.rdstateО: О cin.eof О : О cin. fail О: О cin.badO : О cin.goodO : 1 Ожидается целое, но вводится символ: А После ошибочной операции ввода: cin.rdstateО: 2 cin.eof О : О cin. fail О : 2 cin.badO : О cin.goodO : О После cin.clear О : cin. fail О : О cin.goodO : 1 Рис. 11.29. Проверка состояний ошибок Операция поместить в поток принимает в качестве параметров ссылку на ostream, ссылку на тип, определенный пользователем (в нашем случае - PhoneNumber), и возвращает ссылку на ostream. В программе, приведенной на рис. 11.30, показано, как перегруженная операция поместить в поток отображает объекты типа PhoneNumber в том же виде, в котором они вводились. figll 30.срр Операции поместить в поток и взять из потока определенные пользователем #include <iostream.h> :lass PhoneNumber { friend ostream& operator (ostreamS, PhoneNumberS); friend istreams operator>>(istreamS, PhoneNumberS); private: char areaCode[4]; char exchange[4]; char line [5]; ostreamS operator<<(ostreamS output, PhoneNumberS num) { output ( << тлп.areaCode << ) num. exchange << - << num. liner-return output; istreams operator>> (istreams input, PhoneNumberS num) { input.ignore 0; пропуск ( input.getline(num.areaCode, 4); input. ignore (2) ; пропуск ) и пробела input.getline(num.exchange, 4); input.ignore 0; пропуск - input.getline(num. line, 5); return input; main ( ) ( PhoneNumber phone; cout Введите номер телефона в формате (123) 456-7890: endl; cin >> phone; cout << Введенный номер телефона: << endl << phone << endl; return 0; Введите номер телефона в формате (123) 456-7890: (800) 555-1212 Введенный номер телефона: (800) 555-1212 Рис. 11.30. Определенные пользователем операции поместить в поток и взять из потока
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |