Визначення користувальницьких маніпуляторів
Порядок створення маніпулятора користувача з параметрами, наприклад для виводу наступний: 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 Все права принадлежат авторам размещенных материалов.
|