Рефераты. Препроцессорные средства в C и С++ p>     void reset ( )  { top = EMPTY; }   /* Очистить стек  */

     void push ( Type  c ) { s [ ++top ] = c; }

     Type pop ( ) { return  (s [top—] }

     Type top_of ( ) { return ( s [top ] }

     BOOLEAN  empty ( ) { return BOOLEAN ( top == EMPTY ) }

     BOOLEAN  full  ( ) { return BOOLEAN ( top == max_len ) }

   };

Следует отметить, что в этом примере с целью сокращения исходного текста не предусмотрен контроль выхода за пределы стека в методах push и pop.

Чтобы создать экземпляр параметризованного объектного типа, нужно уточнить имя типа значением параметра в угловых скобках:

stack < int > stack_of_int (50); /* Стек на 50 элементов типа int */

stack < myClass > stmc (20); /* Стек на 20 элементов типа myClass */

В приведенном примере все компоненты-функции определены в описании класса. Когда полное определение функции-члена класса задается вне описания класса, оно должно уточняться описателем template. Например, если бы метод top_of был определен вне описания класса, определение имело бы вид:

template < class Type >

Type top_of ( ) { return s [ top ];}

Отметим некоторые специфические черты описаний параметризованных классов.

Если в параметризованном классе определены friend-функции, то когда такая функция не зависит от параметра, будет использоваться единственная friend-функция для всех значений параметра, а когда friend-функция зависит от параметра, будет использоваться своя friend-функция для каждого значения параметра.

Если в параметризованном классе имеются статические (static) компоненты, то для каждого значения параметра будет использоваться свой экземпляр статической компоненты.

6. Классы для ввода-вывода потоков

 

6.1. Система классов ввода-вывода


Система ввода-вывода С++ основывается на концепции потоков данных, поток представляет собой, с одной стороны, последовательность данных, с другой стороны поток рассматривается как переменная некоторого объектного типа. Это позволяет вынести общие свойства и операции процессов ввода-вывода в определения базовых классов. Ввод-вывод из файлов и консоли, как правило, выполняется с использованием буфера и получение данных программой или вывод данных сводится к пересылке данных из одной области памяти в другую. Реальное обращение к внешним устройствам происходит только при исчерпании данных в буфере (при вводе) или при заполнении буфера (при выводе).

Система классов ввода-вывода С++ использует два базовых класса: класс ios и класс streambuf.

В классе ios определены данные, характеризующие состояние потока, и функции, позволяющие получить доступ к информации о состоянии потока или изменить его состояние. Состояние потока определяется набором битовых флагов, для обращения к отдельным флагам в классе ios описаны перечислимые константы:

- биты состояния (статуса) потока

enum io_state { goodbit = 0x00, // никакие биты не установлены, все хорошо

                     eofbit = 0x01, // конец файла

                     failbit = 0x02, // ошибка в последней операции ввода/вывода

                     badbit = 0x04, // попытка выполнить неверную операцию

                     hardfail = 0x80 // неисправимая ошибка

                   };

- биты режима использования потока (режима ввода/вывода)

enum open_mode { in = 0x01, // поток открыт для чтения

                     out = 0x02, // поток открыт для записи

                     ate = 0x04, // перейти в конец файла при открытии

                     app = 0x08, // режим добавления в конец файла

                     trunc = 0x10, // усечение существующего файла

                  nocreate = 0x20, // ошибка открытия файла, если он не существует

                  noreplace = 0x40, // ошибка открытия, если файл существует

                     binary = 0x80 // двоичный (не текстовый) файл

                   };

- флаги направления позиционирования в потоке

enum seek_dir { beg=0, cur=1, end=2 };

- флаги - манипуляторы управления вводом/выводом

enum { skipws = 0x0001, // пропускать пробелы при вводе

              left = 0x0002, // выравнивание влево при выводе

             right = 0x0004, // выравнивание вправо при выводе

          internal = 0x0008, // пробел после знака или основания системы счисления

               dec = 0x0010, // преобразование в десятичную систему счисления

               oct = 0x0020, // преобразование в восьмеричную систему счисления

               hex = 0x0040, // шестнадцатеричное преобразование

          showbase = 0x0080, // использовать индикатор системы счисления при выводе

         showpoint = 0x0100, // указывать десятичную точку при выводе

                                //(в числах с плавающей точкой)

         uppercase = 0x0200, // прописные буквы при шестнадцатеричном выводе

           showpos = 0x0400, // добавлять '+' для положительных целых

         scientific= 0x0800, // применять нотацию вида 1.2345E2

             fixed = 0x1000, // применять нотацию вида 123.45

           unitbuf = 0x2000, // очищать все потоки после вставки в поток

             stdio = 0x4000, // очищать stdout, stderr после вставки в поток

         boolalpha = 0x8000  // вставлять/извлекать булевы как текст или цифры

          };

Поскольку эти перечислимые константы объявлены как компоненты класса ios, для доступа к ним требуется уточнение контекста, например, ios::in.

Класс streambuf обеспечивает создание и использование буфера ввода-вывода и содержит компоненты-данные для управления буфером и методы доступа к данным в буфере. Объект класса ios содержит указатель на связанный с ним объект streambuf.

Классы istream и ostream являются производными от класса ios, в них определены функции, выполняющие ввод (istream) и вывод (ostream) данных базовых типов и строк.

В классе istream определены операции бесформатного ввода (без преобразования вводимых данных)и операции форматного ввода с преобразованием из внешнего представления во внутреннее.

Функции get() читают из потока данные типа char в массив, определяемый первым параметром, второй параметр задает максимальное число вводимых символов (l), третий параметр устанавливает символ-ограничитель, ограничивающий ввод. За последним введенным символом в массив пишется символ ‘\0’.

istream _FAR & _RTLENTRY get( char _FAR *, int l, char = '\n');

istream _FAR & _RTLENTRY get( signed char _FAR *, int l, char = '\n');

istream _FAR & _RTLENTRY get( unsigned char _FAR *, int l, char ='\n');

Функции read() выполняют чтение из потока и занесение в массив указанного числа символов

istream _FAR & _RTLENTRY read( char _FAR *, int l);

istream _FAR & _RTLENTRY read( signed char _FAR *, int l);

istream _FAR & _RTLENTRY read(unsigned char _FAR *, int l);

Для ввода строки, заканчивающейся символом-ограничителем, служит функция getline() при этом символ-ограничитель также заносится в массив

istream _FAR & _RTLENTRY getline( char _FAR *, int, char = '\n');

istream _FAR & _RTLENTRY getline( signed char _FAR *, int, char= '\n');

istream _FAR & _RTLENTRY getline(unsigned char _FAR *, int, char= '\n');

Для извлечения из потока данных типа char вплоть до символа-ограничителя служит вариант функции get():

istream _FAR & _RTLENTRY get(streambuf _FAR &, char = '\n');

Другие варианты функции get() обеспечивают извлечение одного символа

istream _FAR & _RTLENTRY get( char _FAR &);

istream _FAR & _RTLENTRY get( signed char _FAR &);

istream _FAR & _RTLENTRY get(unsigned char _FAR &);

int _RTLENTRY get(); // возвращает значение символа

int _RTLENTRY peek(); // возвращает следующий символ без удаления его из потока

int _RTLENTRY gcount(); // число символов, извлеченных из потока

// возвращение указанного символа в поток ввода

istream _FAR & _RTLENTRY putback(char);

Пропуск символов с остановкой по ограничителю выполняет функция

istream _FAR & _RTLENTRY ignore(int = 1, int = EOF);

Форматный ввод релизуется на основе переопределения операций ввода

istream _FAR & _RTLENTRY operator>> (bool _FAR &);

istream _FAR & _RTLENTRY operator>>

                      (istream _FAR & (_RTLENTRY *_f)(istream _FAR &));

istream _FAR & _RTLENTRY operator>>

                      (ios _FAR & (_RTLENTRY *_f)(ios _FAR &) );

istream _FAR & _RTLENTRY operator>> ( char _FAR *);

istream _FAR & _RTLENTRY operator>> ( signed char _FAR *);

istream _FAR & _RTLENTRY operator>> (unsigned char _FAR *);

istream _FAR & _RTLENTRY operator>> ( char _FAR &);

istream _FAR & _RTLENTRY operator>> ( signed char _FAR &);

istream _FAR & _RTLENTRY operator>> (unsigned char _FAR &);

istream _FAR & _RTLENTRY operator>> (short _FAR &);

istream _FAR & _RTLENTRY operator>> (int _FAR &);

istream _FAR & _RTLENTRY operator>> (long _FAR &);

istream _FAR & _RTLENTRY operator>> (unsigned short _FAR &);

istream _FAR & _RTLENTRY operator>> (unsigned int _FAR &);

istream _FAR & _RTLENTRY operator>> (unsigned long _FAR &);

istream _FAR & _RTLENTRY operator>> (float _FAR &);

istream _FAR & _RTLENTRY operator>> (double _FAR &);

istream _FAR & _RTLENTRY operator>> (long double _FAR &);

Извлечение из istream и вставка в объект типа streambuf выполняет оператор-функция

istream _FAR & _RTLENTRY operator>> (streambuf _FAR *);

Макрос FAR управляет способом представления указателей, макрос RTLENTRY определяет применение стандартной билиотеки времени выполнения.

Аналогичные операции для вывода определены в классе ostream:

// вставить символ в поток

ostream _FAR & _RTLENTRY put( char);

ostream _FAR & _RTLENTRY put(signed char);

ostream _FAR & _RTLENTRY put(unsigned char);

// вставить в поток строку

ostream _FAR & _RTLENTRY write(const char _FAR *, int l);

ostream _FAR & _RTLENTRY write(const signed char _FAR *, int l);

ostream _FAR & _RTLENTRY write(const unsigned char _FAR *, int l);

Операции форматированного вывола

Вывод "true" или "false" для данных типа bool

ostream _FAR & _RTLENTRY ostream::operator<< (bool);

Страницы: 1, 2, 3, 4, 5, 6, 7



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.