Страница:
278 из 357
h» выглядит так:
struct streambuf (* // управление буфером потока
char* base; // начало буфера char* pptr; // следующий свободный char char* qptr; // следующий заполненный char char* eptr; // один из концов буфера char alloc; // буфер, выделенный с помощью new
// Опустошает буфер: // Возвращает EOF при ошибке и 0 в случае успеха virtual int overflow(intc =EOF);
// Заполняет буфер
// Возвращет EOF при ошибке или конце ввода, // иначе следующий char virtual int underflow();
int snextc() // берет следующий char (* return (++qptr==pptr) ? underflow() : *qptr amp;0377; *)
// ...
int allocate() //выделяет некоторое пространство буфера
streambuf() (* /* ... */*) streambuf(char* p, int l) (* /* ... */*) ~streambuf() (* /* ... */*) *);
Обратите внимание, что здесь определяются указатели, нобходимые для работы с буфером, поэтому обычные посимвольные действия можно определить (только один раз) в виде максимално эффективных inlinфункций. Для каждой конкретной стратгии буферизации необходимо определять только функции перепонения overflow() и underflow(). Например:
struct filebuf : public streambuf (*
int fd; // дескриптор файла char opened; // файл открыт
int overflow(int c =EOF); int underflow();
// ...
// Открывает файл: // если не срабатывает, то возвращет 0, // в случае успеха возвращает «this» filebuf* open(char *name, open_mode om); int close() (* /* ... */ *)
filebuf() (* opened = 0; *) filebuf(int nfd) (* /* ... */ *) filebuf(int nfd, char* p, int l) : (p,l) (* /*...*/ *) ~filebuf() (* close(); *) *);
int filebuf::underflow() // заполняет буфер из fd (* if (!opened !! allocate()==EOF) return EOF;
int count = read(fd, base, eptr-base); if (count « 1) return EOF;
qptr = base; pptr = base + count; return *qptr amp; 0377; *)
8.7 Эффективность
Можно было бы ожидать, что раз ввод/вывод «stream.h» определен с помощью общедоступных средств языка, он будет мнее эффективен, чем встроенное средство. На самом деле это не так.
|< Пред. 276 277 278 279 280 След. >|