Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Ввод и вывод встроенных типов
Для организации ввода/вывода в программе на С++ используется файл включения iostream.h, содержащий определение нескольких классов и объектов, обеспечивающих методы ввода/вывода. В частности, язык поддерживает четыре предопределенных объекта, выполняющих ввод/вывод: - cin – стандартный ввод, соответствующий stdin в Си (обычно клавиатура); - cout – стандартный вывод, соответствующий stdout в Си (обычно терминал); - cerr – стандартный вывод ошибок, соответствующий stderr в Си (обычно терминал); - clog – буферизированная версия cerr (нет эквивалента в Си). Эти стандартные потоки можно переназначить на другие устройства или файлы. cout – объект класса ostream. Этот класс используется для управления форматированным и неформатированным выводом. Здесь определяется операция << для вывода встроенных типов. Пример. class ostream {... public: ostream &operator<<(char*); ostream &operator<<(int); ostream &operator<<(long); ostream &operator<<(double); }; Таким образом, оператор cout<<x посылает в объект класса ostream значение переменной x для вывода. Так как функция operator<< возвращает ссылку на объект класса ostream, то к результату операции вывода можно снова применить операцию вывода, то есть несколько операций можно сцепить. Пример. int x; ... cout<<”x=”<<x<<”\n”; Эта запись будет интерпретироваться следующим образом: (((cout.operator<<(“x=”)).operator<<(x)). operator<<(“\n”) Для вывода двоичных данных полезными могут оказаться функции put и write, объявленные в классе ostream: ostream&ostream:: put(char ch); ostream&ostream:: write(const char *buf, int n); put – записывает единственный символ в поток ostream. write – передает в поток cout заданное количество байт. Так как функции put и write возвращают ссылку на объект класса, для которого он вызвана, то они могут быть сцеплены. Пример. char *str=“Здравствуйте”; cout.put(0x7).put(“\t”).write(str, strlen(str)). put(“\n”); cin – объект класса istream. В классе istream определена перегруженная операция >> для стандартных типов. Ввод определяется аналогично выводу. Пример. class istream {... public: istream &operator<<(char*); istream &operator<<(int); istream &operator<<(long); istream &operator<<(double); }; Объект cin класса istream используется для ввода с указанного устройства. Пример. int x; cin>>x; Функция operator>> возвращает ссылку на объект класса istream, значит, операции ввода можно связать в цепочку. Пример. cin>>x>>d>>c; Эта запись будет интерпретироваться следующим образом: (((cin.operator>>(x)).operator>>(d)).operator>>(c) В качестве альтернативы можно использовать набор перегружаемых функций get. Пример. class istream {... istream &get(char&); istream &get(char *p, int n, char z=”\n”); }; Используя эти функции можно, вывести любые символы, в том числе пробелы. Функция get(char&) читает из потока один символ. Функция get(char*, int, char) читает и размещает по адресу, заданному первым аргументом, не более символов, чем задано вторым аргументом, третий аргумент задает символ-ограничитель, по прочтении которого функция прекращает работу. (По умолчанию это ”\0”, но его можно переустановить) Пример. char buffer[512]; cin.get(buffer, 512, “\v”); Состояние потока Любой поток в каждый момент времени находится в определенном состоянии, учитывая которое, выполняется обработка ошибок и нестандартных ситуаций. Поток может находиться в одном из следующих состояний, определенных перечислением io_state в классе ios. Пример. class ios {... public: enum io_state { goodbit=0x00, eofbit=0x01, failbit=0x02, badbit=0x04, hardfail=0x08 }; ... }; Переменная перечисления типа io.state устанавливается в то или иное состояние в зависимости от того, как прошла последняя операция: - goodbit – нет установленных битов ошибки, операция прошла успешно; - eofbit – конец файла, нет больше символов для ввода; - failbit – последняя операция закончилась с ошибкой, этот поток все еще может быть использован, но бит ошибки должен быть очищен; - badbit – попытка ввода/вывода закончилась ошибкой, поток может быть использован после сброса состояния ошибки; - hardfail – в потоке произошла непоправимая ошибка. Если состояние потока goodbit или eofbit, значит последняя операция ввода/вывода прошла успешно. Состояние goodbit означает, что можно выполнять следующую операцию ввода/вывода и она может пройти успешно, если поток находится в любом другом состоянии, то попытка чтения закончилась неудачей. Если состояние потока ошибочное failbit, badbit, hardfail, все попытки чтения будут игнорированы, пока не будет очищен соответствующий бит в переменной состояния потока. Очистить переменную потока можно член-функцией ios::clear(J), которая устанавливает переменную состояния в целое, заданное аргументом J. Пример. ios:: clear(0) – очищает все биты ошибок, исключая hardfail, так как он не может быть очищен. Практически всегда нужно проверять состояние потока после операции ввода/вывода. Это можно сделать используя член-функцию int ios:: rdstste(); Пример. void main() {int flag; // флаг для состояния потока int integer; cin>>integer; flag=cin.rdstate(); switch(flag) { case ios:: goodbit: cout<<”\n Операция над cin прошла успешно”; break; case ios:: eofbit: cout<<”\n Конец файла”; break; case ios:: failbit: cout<<”\n Ошибка ввода/вывода”; cin.clear(0); break; case ios:: badbit: cout<<”\n Ошибка, возможна потеря символов”; cin.clear(0); break; case ios:: hardfail: cout<<”\n Неисправимая ошибка в cin”; abort(); } } Альтернативный метод проверки состояния потока – это использование функций класса ios. Функции проверки состояния потока: - int rdstate() – возвращает текущее состояние ошибки; - void clear(int J=0) – устанавливает переменную в состояние J; - int good() – возвращает не ноль, если нет установленных битов ошибки, иначе возвращает ноль; - int eof() – возвращает не ноль, если установлен eofbit, иначе возвращает ноль; - int fail() – возвращает не ноль, если установлены failbit, badbit или hardfail, иначе возвращает ноль; - int bad()– возвращает не ноль, если установлены badbit или hardfail, иначе возвращает ноль. Состояние потока может быть проверено как обычное логическое выражение. Пример. if (cin>>ch) cout<<”Cимвол введен”; или if (!cin) cerr<<”Ошибка ввода”; Это возможно из-за перегрузки операций int operator!(); operator void *(); // преобразует из типа потока в тип указателя на void Пример. void main() {int integer; cin>>integer; if (!cin) if(!cin.bad()) {cout<<”\nОшибка”; cin.clear(0); } else {cerr<<”\nКритическая ошибка”; abort(); } cout<<integer; } Date: 2016-05-13; view: 398; Нарушение авторских прав |