Здавалка
Главная | Обратная связь

Визначення користувальницьких маніпуляторів



Порядок створення маніпулятора користувача з параметрами, наприклад для виводу наступний:

1.Визначити клас (my_manip) з полями: параметри маніпулятора + поле – покажчик на функцію типу

ostream& (*f)(ostream&,<параметри маніпулятора>);

2.Визначити конструктор цього класу (my_manip) з ініціалізацією полів.

3.Визначити в цьому класі дружню функцію – operator<<. Ця функція як правий аргумент приймає об'єкт класу (my_manip) лівого аргументу (операнда), потік ostream і повертає потік ostream як результат виконання функції *f. Наприклад,

typedef far ostream&(far *PTF)(ostream&,int,int,char);

class my_man{

int w;int n;char fill;

PTF f;

public:

//конструктор

my_man(PTF F,int W,int N,char FILL):f(F),w(W),n(N),fill(FILL){}

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

};

ostream& operator<<(ostream& out,my_man& my)

{return my.f(out,my.w,my.n,my.fill);}

4.Визначити функцію типу *f (fmanip), що приймає потік і параметри маніпулятора і повертаючу потік. Ця функція власне і виконує форматування. Наприклад,

ostream& fmanip(ostream& s,int w,int n,char fill)

{s.width(w);

s.flags(ios::fixed);

s.precision(n);

s.fill(fill);

return s;}

5.Визначити власне маніпулятор (wp) як функцію, що приймає параметри маніпулятора і повертає об'єкт my_manip, поле f якого містить покажчик на функцію fmanip. Наприклад,

my_man wp(int w,int n,char fill)

{return my_man(fmanip,w,n,fill);}

Для створення користувальницьких маніпуляторів з параметрами можна використовувати макроси, що містяться у файлі <iomanip.h>:

OMANIP(int)

IMANIP(int)

IOMANIP(int)

Стан потоку

Кожен потік має зв'язаний з ним стан. Стани потоку описуються в класі ios у виді перерахування enum.

public:

enum io_state{

goodbit, //немає помилки 0Х00

eofbit, //кінець файлу 0Х01

failbit, //остання операція не виконалася 0Х02

badbit, //спроба використання неприпустимої операції 0Х04

hardfail //фатальна помилка 0Х08

};

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

Крім того, перевірити стан потоку можна наступними функціями:

int bad(); 1, якщо badbit чи hardfail

int eof(); 1, якщо eofbit

int fail(); 1, якщо failbit, badbit чи hardfail

int good(); 1, якщо goodbit

Якщо операція >> використовується для нових типів даних, то при її перевантаженні необхідно передбачити відповідні перевірки.

Файловий ввід-вивід

Потоки для роботи з файлами створюються як об'єкти наступних класів:

ofstream – запис у файл;

ifstream – читання з файлу;

fstream – читання/запис.

Для створення потоків маються наступні конструктори.

* fstream();

створює потік, не приєднуючи його ні до якого файлу.

* fstream(const char* name,int mode,int p=filebuf::openprot);

створює потік, приєднує його до файлу з ім'ям name, попередньо відкривши файл, встановлює для нього режим mode і рівень захисту p. Якщо файл не існує, то він створюється. Для mode=ios::out, якщо файл існує, те його розмір буде усічений до нуля.

Прапори режиму визначені в класі ios і мають наступні значення.

in -для читання

out -для запису

ate -індекс потоку поміщений у кінець файлу. Читання більше не припустиме, виведені дані записуються в кінець файлу.

app -потік відкритий для додавання даних у кінець. Незалежно від seekp() дані будуть записуватися в кінець

trunc -усікання існуючого потоку до нуля

nocreate -команда відкриття потоку буде завершена невдало, якщо файл не існує

noreplace -команда відкриття потоку буде завершена невдало, якщо файл існує

binary - потік відкривається для двійкового обміну

Якщо при створенні потоку він не приєднаний до файлу, то приєднати існуючий потік до файлу можна функцією

void open(const char* name,int mode,int p=filebuf::openprot);

Функція

void fstreambase::close();

скидає буфер потоку, від'єднує потік від файлу і закриває файл. Цю функцію необхідно явно викликати при зміні режиму роботи з потоком. Автоматично вона викликається тільки при завершенні програми.

У такий спосіб створити потік і зв'язати його з файлом можна трьома способами:

1.

Створюється об'єкт filebuf

filebuf fbuf;

Об'єкт filebuf зв'язується з пристроєм (файлом)

fbuf.open(“ім'я”,ios::in);

Створюється потік і зв'язується з filebuf

istream stream(&fbuf);

2.

Створюється об'єкт fstream (ifstream, ofstream)

fstream stream;

Відкривається файл, що зв'язується через filebuf з потоком

stream.open(“ім'я”,ios::in);

3.

Створюється об'єкт fstream, одночасно відкривається файл, що зв'язується з потоком

fstream stream(“ім'я”,ios::in);







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.