Программирование >>  Структурное программирование 

1 ... 219 220 221 [ 222 ] 223 224 225 ... 342


умолчанию параметр функции 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. Определенные пользователем операции поместить в поток и взять из потока



1 ... 219 220 221 [ 222 ] 223 224 225 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика