Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по ООП.doc
Скачиваний:
31
Добавлен:
25.09.2019
Размер:
1.04 Mб
Скачать

42.Организация ввода-вывода для пользовательского типа

Хоть стандартные потоки и позволяют выводить только встроенные типы, эту проблему можно с легкостью обойти. Надо просто для класса, который мы хотим выводить в поток, определить дружественный оператор <<, у которого первый параметр и возвращаемое значение – поток, второй параметр - объект данного класса:

include &ltiostream.h>

include &ltconio.h>

class cVector{

public:

float x,y;

cVector( void ){x=1;y=2;}

friend ostream &operator<<( ostream& , cVector & );

};

ostream &operator<<( ostream & ostr , cVector &v ){

cout<<"x:"<<v.x<<endl;

cout<<"y:"<<v.y<<endl;

return( ostr );

}

int main( void ){

cVector v;

cout<<v<<endl;

getch();

return 0;

}

40.Параметризованные манипуляторы и форматирующие функции.

Манипуляторы являются функциями, которые можно включать в цепочку последовательных операций помещения и извлечения. Это удобный способ управления флагами потока. Однако, применение манипуляторов этим не ограничивается. Изменения, внесенные в поток манипулятором, сохраняются до следующего использования того же манипулятора, за исключением манипулятора setw.

Различают простые и параметризованные манипуляторы.

Параметризованные манипуляторы требуют при использовании спецификации аргументов:

setw(int) - задает значение внутренней переменной ширины поля;

setfill(int) - задает заполняющий символ;

setprecision(int) - задает значение внутренней переменной точности вещественных чисел;

setiosflags(long) - устанавливает флаги, биты которых заданы в переданном параметре;

resetiosflags(long) - сбрасывает флаги, биты которых заданы в переданном параметре.

Пример:

#include <iomanip.h>

void main()

{

cout << '(' << setw(4) << -12 << ") " <<

1234.56789 << ' ' <<

setiosflags(ios::scientific) << 1234.56789 << ' '

setiosflags(ios::fixed) << 1234.56789 << endl;

}

Результат: ( -12) 1234.57 1.234568e+03 1234.567890

К функциям форматирования относятся следующие функции класса ios:

width() - определения ширины поля;

fill() - определения символа-заполнителя;

precision() - определения точности чисел с плавающей точкой.

Определение ширины поля:

int width() - возвращает текущее значение внутренней переменной ширины поля потока;

int width(int) - устанавливает значение внутренней переменной ширины поля и возвращает предыдущее значение.

Определение символа-заполнителя:

char fill() - возвращает текущий символ-заполнителя;

char fill(char) - устанавливает символ-заполнитель и возвращает его предыдущее значение. Установленный символ используется вместо пробела для дополнения полей при выводе до указанной ширины

Определение точности чисел с плавающей точкой:

int precision() - возвращает текущее значение внутренней переменной точности;

int precision(int) - устанавливает значение внутренней переменной точности и возвращает предыдущее значение.

41.Состояния потока.

Каждый поток имеет связанное с ним состояние. Состояния потока описываются в классе ios в виде перечисления enum.

public:

enum io_state {

goodbit, // нет ошибки 0Х00

eofbit, // конец файла 0Х01

failbit, // последняя операция не выполнилась 0Х02

badbit, // попытка использования недопустимой операции 0Х04

hardfail // фатальная ошибка 0Х08

};

eof() возвращает true, если достигнут конец файла:

if ( inOut.eof() )

// отлично: все прочитано ...

bad() возвращает true при попытке выполнения некорректной операции, например при установке позиции за концом файла. Обычно это свидетельствует о том, что поток находится в состоянии ошибки;

fail() возвращает true, если операция завершилась неудачно, например не удалось открыть файл или передан некорректный формат ввода:

ifstream iFile( filename, ios_base::in );

if ( iFile.fail() ) // не удалось открыть

error_message( ... );

good() возвращает true, если все вышеперечисленные условия ложны:

if ( inOut.good() )

Флаги, определяющие результат последней операции объектом ios, содержатся в переменной state. Получить значение этой переменной можно с помощью функции int rdstate().

Кроме того, проверить состояние потока можно следующими функциями:

int bad(void); // 1, badbit или hardfail

int eof(void); // 1, если eofbit

int fail(void); // 1, если failbit, badbit или hardfail

int good(void); // 1, если goodbit

Если операция >> используется для новых типов данных, то при её перегрузке необходимо предусмотреть соответствующие проверки.