Программирование >>  Операторы преобразования типа 

1 ... 207 208 209 [ 210 ] 211 212 213 ... 239


/* Деструктор

* - Очистка буфера данных */

virtual -outbufО { sync О:

protected: Вывод Символов, хранящихся в буфере int flushBuffer О {

int num = pptrO-pbaseO: if (write (1. buffer, num) != num) { return EOF;

pbump (-num): Соответствующий перевод указателя вывода return num:

/* Буфер полон

* - Вывести с и все предшествующие символы */

virtual int type overflow (int type с) { if (С != EOF) {

Вставка символа в буфер *pptr() С: pbump(l):

Очистка буфера

if (flushBufferO -= EOF) {

ERROR

return EOF;

return c:

/* Синхронизация данных с файлом/приеиникон

* - вывод данных из буфера */

virtual int sync О {

if (flushBufferO == EOF) { ОШИБКА return -1;

return 0:

Конструктор инициализирует буфер вывода функцией setp(): setp (buffer. buffer+(bufferSize-l)):



Буфер вывода настроен так, что функция overflow() вызывается, когда еще остается место для одного символа. Если функция overflow() вызывается с аргументом, отличным от EOF, то соответствующий символ может быть помещен в текущую позицию записи, поскольку указатель на нее не выходит за пределы конечного указателя. После того как аргумент overflow() будет помещен в позицию записи, буфер можно очистить.

Именно эта задача решается функцией flushBuffer(). Функция записывает символы в стандартный канал вывода (дескриптор 1) при помощи фзшкции writeQ. Функция pbumpO потокового буфера возвращает позицию записи к началу буфера.

Функция overflowO вставляет в буфер символ, ставший причиной вызова overflowO, если он отличен от EOF. Затем функция pbunfip() смещает текущую позицию записи, чтобы она отражала новый конец блока буферизованных символов. Тем самым позиция записи временно смещается за конечную позицию (epptrO).

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

Виртуальный деструктор обеспечивает вывод данных, остающихся в буфере при его уничтожении.

Эти функции переопределяются для большинства потоковых буферов. Если внешнее представление имеет особую структуру, возможно, придется переопределить дополнительные функции, например функции seekoff() и seekpos(), для управления позицией записи.

Пользовательские буферы ввода

в сущности, механизм ввода работает по тем же принципам, что и механизм вывода. Однако для ввода также существует возможность отмены последнего чтения. Функции sungetcO (вызывается функцией unget() входного потока данных) и sputbackcO (вызывается функцией putback() входного потока данных) используются для восстановления потокового буфера в состоянии перед последним чтением. Также существует возможность чтения следующего символа без перемещения позиции чтения. Следовательно, при реализации чтения из потокового буфера приходится переопределять больше функций, чем при реализации записи в потоковый буфер.

Для буфера, используемого для записи символов, поддерживаются три указателя, которые могут быть получены функциями еЬаскО, gptrO и egptr() (рис. 13.5):

О еЬаскО ( база ввода ) - определяет начало буфера ввода или конец области отката;

О gptrO ( указатель ввода ) - определяет текущую позицию чтения; О egptrO ( конец ввода ) - определяет конец буфера ввода.



back о

gptro

gptr()

Рис. 13.5. Интерфейс чтения из потоковых буферов

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

Одиночные символы читаются функциями sgetc() и sbumpc(). Отличие между этими функциями состоит в том, что функция sbumpcO увеличивает указатель текущей позиции ввода, а функция sgetcO этого не делает. Если буфер будет полностью прочитан (gptr()==egptr()), значит, доступных символов нет и буфер необходимо заполнять заново. Для этого вызывается виртуальная функция underflow(), отвечающая за чтение данных. С другой стороны, функция sbumpc() при отсутствии символов вызывает виртуальную функцию uflowO. По умолчанию uflowO просто вызывает underflowO, а затем увеличивает указатель. По умолчанию версия underflowO в базовом классе basic streambuf возвращает EOF, то есть признак невозможности дальнейшего чтения с использованием стандартной реализации.

Функция sgetnO предназначена для чтения сразу нескольких символов. Она перепоручает работу виртуальной функции xsgetnO. В реализации по умолчанию xsgetnO просто читает символы, вызывая для каждого из них sbumpcO. По аналогии с функцией xsputnO при записи функция xsgetn() используется для оптимизации чтения нескольких символов.

В отличие от вывода для ввода недостаточно переопределить одну функцию. Вам придется либо выполнить настройку буфера, либо, по крайней мере, реализовать функции underflowO и uflowO. Дело в том, что функция underflowO не перемещается за текущий символ, однако она может быть вызвана из sgetcC). Перемещение к следующему символу приходится выполнять путем манипуляций с буфером или вызовом uflowO. В любом случае функция underflowO должна быть реализована для любого потокового буфера, поддерживающего чтение символов. Если реализованы обе функции, underflowO и uflowO, в настройке буфера нет необходимости.

Настройка буфера чтения осуществляется функцией setg(), получающей следующие три аргумента (именно в таком порядке):

О указатель на начало буфера (еЬаск());

О указатель на текущую позицию чтения (gptrO);

О указатель на конец буфера (egptrO).

В отличие от setp() функция setgO вызывается с тремя аргументами. Это необходимо для того, чтобы вы могли зарезервировать память для символов, возвращаемых в поток данных. Таким образом, при настройке буфера ввода желательно, чтобы некоторые символы (по крайней мере один) уже были прочитаны, но еще не сохранены в буфере.



1 ... 207 208 209 [ 210 ] 211 212 213 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика