Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 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; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.012 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию